// This file is distributed under the University of Illinois Open Source License.
// See LICENSE.TXT for details.
// RUN: c_compiler -c -o %t1.o -I "common" "common/testsuite.c"
// RUN: cxx_compiler cxx_rtti -c %s -I "common" -o %t2.o
// RUN: c_compiler -c %s -I "common" -o %t3.o
// RUN: linker -o %t2%exeext  %t1.o %t2.o %t3.o
// RUN: runtool %t2%exeext | checker "TEST PASSED"
#include "testsuite.h"
#ifdef __cplusplus

struct  S10103C2_nt  {
  virtual  ~S10103C2_nt(); // _ZN11S10103C2_ntD1Ev
  virtual void  v6(); // _ZN11S10103C2_nt2v6Ev
  S10103C2_nt(); // tgen
};
//SIG(-1 S10103C2_nt) C1{ vd v1}


 S10103C2_nt ::~S10103C2_nt(){ note_dtor("S10103C2_nt", this);}
void  S10103C2_nt ::v6(){vfunc_called(this, "_ZN11S10103C2_nt2v6Ev");}
S10103C2_nt ::S10103C2_nt(){ note_ctor("S10103C2_nt", this);} // tgen

//skip512 S10103C2_nt

#else // __cplusplus

extern void _ZN11S10103C2_ntC1Ev();
extern void _ZN11S10103C2_ntD1Ev();
Name_Map name_map_S10103C2_nt[] = {
  NSPAIR(_ZN11S10103C2_ntC1Ev),
  NSPAIR(_ZN11S10103C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S10103C2_nt[];
extern void _ZN11S10103C2_ntD1Ev();
extern void _ZN11S10103C2_ntD0Ev();
extern void _ZN11S10103C2_nt2v6Ev();
static  VTBL_ENTRY vtc_S10103C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S10103C2_nt[0]),
  (VTBL_ENTRY)&_ZN11S10103C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN11S10103C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN11S10103C2_nt2v6Ev,
};
extern VTBL_ENTRY _ZTI11S10103C2_nt[];
VTBL_ENTRY *P__ZTI11S10103C2_nt = _ZTI11S10103C2_nt; 
extern  VTBL_ENTRY _ZTV11S10103C2_nt[];
Class_Descriptor cd_S10103C2_nt = {  "S10103C2_nt", // class name
  0,0,//no base classes
  &(vtc_S10103C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI11S10103C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV11S10103C2_nt),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C3_nt  {
  void *s10103c3f0;
  virtual  ~S10103C3_nt(); // _ZN11S10103C3_ntD1Ev
  virtual void  v7(); // _ZN11S10103C3_nt2v7Ev
  virtual void  v8(); // _ZN11S10103C3_nt2v8Ev
  virtual void  v9(); // _ZN11S10103C3_nt2v9Ev
  virtual void  v10(); // _ZN11S10103C3_nt3v10Ev
  virtual void  v11(); // _ZN11S10103C3_nt3v11Ev
  S10103C3_nt(); // tgen
};
//SIG(-1 S10103C3_nt) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10103C3_nt ::~S10103C3_nt(){ note_dtor("S10103C3_nt", this);}
void  S10103C3_nt ::v7(){vfunc_called(this, "_ZN11S10103C3_nt2v7Ev");}
void  S10103C3_nt ::v8(){vfunc_called(this, "_ZN11S10103C3_nt2v8Ev");}
void  S10103C3_nt ::v9(){vfunc_called(this, "_ZN11S10103C3_nt2v9Ev");}
void  S10103C3_nt ::v10(){vfunc_called(this, "_ZN11S10103C3_nt3v10Ev");}
void  S10103C3_nt ::v11(){vfunc_called(this, "_ZN11S10103C3_nt3v11Ev");}
S10103C3_nt ::S10103C3_nt(){ note_ctor("S10103C3_nt", this);} // tgen

//skip512 S10103C3_nt

#else // __cplusplus

extern void _ZN11S10103C3_ntC1Ev();
extern void _ZN11S10103C3_ntD1Ev();
Name_Map name_map_S10103C3_nt[] = {
  NSPAIR(_ZN11S10103C3_ntC1Ev),
  NSPAIR(_ZN11S10103C3_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S10103C3_nt[];
extern void _ZN11S10103C3_ntD1Ev();
extern void _ZN11S10103C3_ntD0Ev();
extern void _ZN11S10103C3_nt2v7Ev();
extern void _ZN11S10103C3_nt2v8Ev();
extern void _ZN11S10103C3_nt2v9Ev();
extern void _ZN11S10103C3_nt3v10Ev();
extern void _ZN11S10103C3_nt3v11Ev();
static  VTBL_ENTRY vtc_S10103C3_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S10103C3_nt[0]),
  (VTBL_ENTRY)&_ZN11S10103C3_ntD1Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_ntD0Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v7Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v8Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v9Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v10Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v11Ev,
};
extern VTBL_ENTRY _ZTI11S10103C3_nt[];
VTBL_ENTRY *P__ZTI11S10103C3_nt = _ZTI11S10103C3_nt; 
extern  VTBL_ENTRY _ZTV11S10103C3_nt[];
Class_Descriptor cd_S10103C3_nt = {  "S10103C3_nt", // class name
  0,0,//no base classes
  &(vtc_S10103C3_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI11S10103C3_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV11S10103C3_nt),9, //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

struct  S10103C7_nt  {
  void  mf10103c7(); // _ZN11S10103C7_nt9mf10103c7Ev
};
//SIG(-1 S10103C7_nt) C1{ m}


void  S10103C7_nt ::mf10103c7(){}

//skip512 S10103C7_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C6_nt  {
  void *s10103c6f0;
  int s10103c6f1;
  ::S10103C7_nt s10103c6f2;
  ::S10103C7_nt s10103c6f3;
  void  mf10103c6(); // _ZN11S10103C6_nt9mf10103c6Ev
};
//SIG(-1 S10103C6_nt) C1{ m Fp Fi FC2{ m} FC2}


void  S10103C6_nt ::mf10103c6(){}

//skip512 S10103C6_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C5_nt  {
  ::S10103C6_nt s10103c5f0;
  ::S10103C6_nt s10103c5f1;
  char s10103c5f2;
  void  mf10103c5(); // _ZN11S10103C5_nt9mf10103c5Ev
  virtual  ~S10103C5_nt(); // _ZN11S10103C5_ntD1Ev
  S10103C5_nt(); // tgen
};
//SIG(-1 S10103C5_nt) C1{ vd m FC2{ m Fp Fi FC3{ m} FC3} FC2 Fc}


void  S10103C5_nt ::mf10103c5(){}
 S10103C5_nt ::~S10103C5_nt(){ note_dtor("S10103C5_nt", this);}
S10103C5_nt ::S10103C5_nt(){ note_ctor("S10103C5_nt", this);} // tgen

//skip512 S10103C5_nt

#else // __cplusplus

extern void _ZN11S10103C5_ntC1Ev();
extern void _ZN11S10103C5_ntD1Ev();
Name_Map name_map_S10103C5_nt[] = {
  NSPAIR(_ZN11S10103C5_ntC1Ev),
  NSPAIR(_ZN11S10103C5_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern void _ZN11S10103C5_ntD1Ev();
extern void _ZN11S10103C5_ntD0Ev();
static  VTBL_ENTRY vtc_S10103C5_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S10103C5_nt[0]),
  (VTBL_ENTRY)&_ZN11S10103C5_ntD1Ev,
  (VTBL_ENTRY)&_ZN11S10103C5_ntD0Ev,
};
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
VTBL_ENTRY *P__ZTI11S10103C5_nt = _ZTI11S10103C5_nt; 
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
Class_Descriptor cd_S10103C5_nt = {  "S10103C5_nt", // class name
  0,0,//no base classes
  &(vtc_S10103C5_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI11S10103C5_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV11S10103C5_nt),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C15  {
  void  mf10103c15(); // _ZN9S10103C1510mf10103c15Ev
};
//SIG(-1 S10103C15) C1{ m}


void  S10103C15 ::mf10103c15(){}

static void Test_S10103C15()
{
  {
    init_simple_test("S10103C15");
    S10103C15 lv;
    check2(sizeof(lv), 1, "sizeof(S10103C15)");
    check2(__alignof__(lv), 1, "__alignof__(S10103C15)");
  }
}
static Arrange_To_Call_Me vS10103C15(Test_S10103C15, "S10103C15", 1);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C14_nt  {
  void *s10103c14f0;
  int s10103c14f1;
  ::S10103C15 s10103c14f2;
  void  mf10103c14(); // _ZN12S10103C14_nt10mf10103c14Ev
};
//SIG(-1 S10103C14_nt) C1{ m Fp Fi FC2{ m}}


void  S10103C14_nt ::mf10103c14(){}

//skip512 S10103C14_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C13_nt  {
  ::S10103C14_nt s10103c13f0;
  int s10103c13f1;
  void  mf10103c13(); // _ZN12S10103C13_nt10mf10103c13Ev
};
//SIG(-1 S10103C13_nt) C1{ m FC2{ m Fp Fi FC3{ m}} Fi}


void  S10103C13_nt ::mf10103c13(){}

//skip512 S10103C13_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C16_nt  {
  int s10103c16f0[4];
  void *s10103c16f1;
  char s10103c16f2;
  int s10103c16f3[2];
  void *s10103c16f4[2];
  void  mf10103c16(); // _ZN12S10103C16_nt10mf10103c16Ev
};
//SIG(-1 S10103C16_nt) C1{ m Fi[4] Fp Fc Fi[2] Fp[2]}


void  S10103C16_nt ::mf10103c16(){}

//skip512 S10103C16_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C17  {
  char s10103c17f0;
  int s10103c17f1[2];
  void *s10103c17f2;
  void  mf10103c17(); // _ZN9S10103C1710mf10103c17Ev
};
//SIG(-1 S10103C17) C1{ m Fc Fi[2] Fp}


void  S10103C17 ::mf10103c17(){}

static void Test_S10103C17()
{
  {
    init_simple_test("S10103C17");
    S10103C17 lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S10103C17)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C17)");
    check_field_offset(lv, s10103c17f0, 0, "S10103C17.s10103c17f0");
    check_field_offset(lv, s10103c17f1, 4, "S10103C17.s10103c17f1");
    check_field_offset(lv, s10103c17f2, ABISELECT(16,12), "S10103C17.s10103c17f2");
  }
}
static Arrange_To_Call_Me vS10103C17(Test_S10103C17, "S10103C17", ABISELECT(24,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C12  {
  void *s10103c12f0;
  ::S10103C13_nt s10103c12f1;
  ::S10103C16_nt s10103c12f2;
  ::S10103C17 s10103c12f3;
  virtual  ~S10103C12(); // _ZN9S10103C12D1Ev
  virtual void  v14(); // _ZN9S10103C123v14Ev
  virtual void  v15(); // _ZN9S10103C123v15Ev
  virtual void  v16(); // _ZN9S10103C123v16Ev
  virtual void  v17(); // _ZN9S10103C123v17Ev
  virtual void  v18(); // _ZN9S10103C123v18Ev
  virtual void  v19(); // _ZN9S10103C123v19Ev
  virtual void  v20(); // _ZN9S10103C123v20Ev
  virtual void  v21(); // _ZN9S10103C123v21Ev
  virtual void  v22(); // _ZN9S10103C123v22Ev
  virtual void  v23(); // _ZN9S10103C123v23Ev
  virtual void  v24(); // _ZN9S10103C123v24Ev
  virtual void  v25(); // _ZN9S10103C123v25Ev
  virtual void  v26(); // _ZN9S10103C123v26Ev
  virtual void  v27(); // _ZN9S10103C123v27Ev
  virtual void  v28(); // _ZN9S10103C123v28Ev
  virtual void  v29(); // _ZN9S10103C123v29Ev
  virtual void  v30(); // _ZN9S10103C123v30Ev
  virtual void  v31(); // _ZN9S10103C123v31Ev
  virtual void  v32(); // _ZN9S10103C123v32Ev
  virtual void  v33(); // _ZN9S10103C123v33Ev
  virtual void  v34(); // _ZN9S10103C123v34Ev
  virtual void  v35(); // _ZN9S10103C123v35Ev
  virtual void  v36(); // _ZN9S10103C123v36Ev
  virtual void  v37(); // _ZN9S10103C123v37Ev
  S10103C12(); // tgen
};
//SIG(-1 S10103C12) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S10103C12 ::~S10103C12(){ note_dtor("S10103C12", this);}
void  S10103C12 ::v14(){vfunc_called(this, "_ZN9S10103C123v14Ev");}
void  S10103C12 ::v15(){vfunc_called(this, "_ZN9S10103C123v15Ev");}
void  S10103C12 ::v16(){vfunc_called(this, "_ZN9S10103C123v16Ev");}
void  S10103C12 ::v17(){vfunc_called(this, "_ZN9S10103C123v17Ev");}
void  S10103C12 ::v18(){vfunc_called(this, "_ZN9S10103C123v18Ev");}
void  S10103C12 ::v19(){vfunc_called(this, "_ZN9S10103C123v19Ev");}
void  S10103C12 ::v20(){vfunc_called(this, "_ZN9S10103C123v20Ev");}
void  S10103C12 ::v21(){vfunc_called(this, "_ZN9S10103C123v21Ev");}
void  S10103C12 ::v22(){vfunc_called(this, "_ZN9S10103C123v22Ev");}
void  S10103C12 ::v23(){vfunc_called(this, "_ZN9S10103C123v23Ev");}
void  S10103C12 ::v24(){vfunc_called(this, "_ZN9S10103C123v24Ev");}
void  S10103C12 ::v25(){vfunc_called(this, "_ZN9S10103C123v25Ev");}
void  S10103C12 ::v26(){vfunc_called(this, "_ZN9S10103C123v26Ev");}
void  S10103C12 ::v27(){vfunc_called(this, "_ZN9S10103C123v27Ev");}
void  S10103C12 ::v28(){vfunc_called(this, "_ZN9S10103C123v28Ev");}
void  S10103C12 ::v29(){vfunc_called(this, "_ZN9S10103C123v29Ev");}
void  S10103C12 ::v30(){vfunc_called(this, "_ZN9S10103C123v30Ev");}
void  S10103C12 ::v31(){vfunc_called(this, "_ZN9S10103C123v31Ev");}
void  S10103C12 ::v32(){vfunc_called(this, "_ZN9S10103C123v32Ev");}
void  S10103C12 ::v33(){vfunc_called(this, "_ZN9S10103C123v33Ev");}
void  S10103C12 ::v34(){vfunc_called(this, "_ZN9S10103C123v34Ev");}
void  S10103C12 ::v35(){vfunc_called(this, "_ZN9S10103C123v35Ev");}
void  S10103C12 ::v36(){vfunc_called(this, "_ZN9S10103C123v36Ev");}
void  S10103C12 ::v37(){vfunc_called(this, "_ZN9S10103C123v37Ev");}
S10103C12 ::S10103C12(){ note_ctor("S10103C12", this);} // tgen

static void Test_S10103C12()
{
  extern Class_Descriptor cd_S10103C12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S10103C12, buf);
    S10103C12 *dp, &lv = *(dp=new (buf) S10103C12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S10103C12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C12)");
    check_field_offset(lv, s10103c12f0, ABISELECT(8,4), "S10103C12.s10103c12f0");
    check_field_offset(lv, s10103c12f1, ABISELECT(16,8), "S10103C12.s10103c12f1");
    check_field_offset(lv, s10103c12f2, ABISELECT(40,24), "S10103C12.s10103c12f2");
    check_field_offset(lv, s10103c12f3, ABISELECT(96,64), "S10103C12.s10103c12f3");
    test_class_info(&lv, &cd_S10103C12);
    dp->~S10103C12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C12(Test_S10103C12, "S10103C12", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN9S10103C12C1Ev();
extern void _ZN9S10103C12D1Ev();
Name_Map name_map_S10103C12[] = {
  NSPAIR(_ZN9S10103C12C1Ev),
  NSPAIR(_ZN9S10103C12D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10103C12[];
extern void _ZN9S10103C12D1Ev();
extern void _ZN9S10103C12D0Ev();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C12[0]),
  (VTBL_ENTRY)&_ZN9S10103C12D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C12D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
Class_Descriptor cd_S10103C12 = {  "S10103C12", // class name
  0,0,//no base classes
  &(vtc_S10103C12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI9S10103C12),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10103C12),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C18  {
  int s10103c18f0[11];
};
//SIG(-1 S10103C18) C1{ Fi[11]}



static void Test_S10103C18()
{
  {
    init_simple_test("S10103C18");
    S10103C18 lv;
    check2(sizeof(lv), 44, "sizeof(S10103C18)");
    check2(__alignof__(lv), 4, "__alignof__(S10103C18)");
    check_field_offset(lv, s10103c18f0, 0, "S10103C18.s10103c18f0");
  }
}
static Arrange_To_Call_Me vS10103C18(Test_S10103C18, "S10103C18", 44);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C20_nt  {
  void *s10103c20f0;
  int s10103c20f1[2];
  ::S10103C15 s10103c20f2;
  void  mf10103c20(); // _ZN12S10103C20_nt10mf10103c20Ev
};
//SIG(-1 S10103C20_nt) C1{ m Fp Fi[2] FC2{ m}}


void  S10103C20_nt ::mf10103c20(){}

//skip512 S10103C20_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C23_nt  {
  __tsi64 s10103c23f0[4];
};
//SIG(-1 S10103C23_nt) C1{ FL[4]}



//skip512 S10103C23_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C22_nt  {
  ::S10103C23_nt s10103c22f0;
  void  mf10103c22(); // _ZN12S10103C22_nt10mf10103c22Ev
};
//SIG(-1 S10103C22_nt) C1{ m FC2{ FL[4]}}


void  S10103C22_nt ::mf10103c22(){}

//skip512 S10103C22_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C19  {
  int s10103c19f0;
  ::S10103C20_nt s10103c19f1;
  ::S10103C22_nt s10103c19f2;
  void  mf10103c19(); // _ZN9S10103C1910mf10103c19Ev
  virtual  ~S10103C19(); // _ZN9S10103C19D1Ev
  S10103C19(); // tgen
};
//SIG(-1 S10103C19) C1{ vd m Fi FC2{ m Fp Fi[2] FC3{ m}} FC4{ m FC5{ FL[4]}}}


void  S10103C19 ::mf10103c19(){}
 S10103C19 ::~S10103C19(){ note_dtor("S10103C19", this);}
S10103C19 ::S10103C19(){ note_ctor("S10103C19", this);} // tgen

static void Test_S10103C19()
{
  extern Class_Descriptor cd_S10103C19;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,15)];
    init_test(&cd_S10103C19, buf);
    S10103C19 *dp, &lv = *(dp=new (buf) S10103C19());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,56), "sizeof(S10103C19)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C19)");
    check_field_offset(lv, s10103c19f0, ABISELECT(8,4), "S10103C19.s10103c19f0");
    check_field_offset(lv, s10103c19f1, ABISELECT(16,8), "S10103C19.s10103c19f1");
    check_field_offset(lv, s10103c19f2, ABISELECT(40,24), "S10103C19.s10103c19f2");
    test_class_info(&lv, &cd_S10103C19);
    dp->~S10103C19();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C19(Test_S10103C19, "S10103C19", ABISELECT(72,56));

#else // __cplusplus

extern void _ZN9S10103C19C1Ev();
extern void _ZN9S10103C19D1Ev();
Name_Map name_map_S10103C19[] = {
  NSPAIR(_ZN9S10103C19C1Ev),
  NSPAIR(_ZN9S10103C19D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10103C19[];
extern void _ZN9S10103C19D1Ev();
extern void _ZN9S10103C19D0Ev();
static  VTBL_ENTRY vtc_S10103C19[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C19[0]),
  (VTBL_ENTRY)&_ZN9S10103C19D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C19D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C19[];
extern  VTBL_ENTRY _ZTV9S10103C19[];
Class_Descriptor cd_S10103C19 = {  "S10103C19", // class name
  0,0,//no base classes
  &(vtc_S10103C19[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,56), // object size
  NSPAIRA(_ZTI9S10103C19),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10103C19),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C4  : S10103C5_nt , S10103C12 {
  int s10103c4f0;
  void *s10103c4f1[8];
  int s10103c4f2[2];
  ::S10103C18 s10103c4f3;
  int s10103c4f4[4];
  char s10103c4f5;
  ::S10103C19 s10103c4f6;
  void *s10103c4f7;
  virtual  ~S10103C4(); // _ZN8S10103C4D1Ev
  virtual void  v12(); // _ZN8S10103C43v12Ev
  virtual void  v13(); // _ZN8S10103C43v13Ev
  S10103C4(); // tgen
};
//SIG(-1 S10103C4) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 Fi Fp[8] Fi[2] FC11{ Fi[11]} Fi[4] Fc FC12{ vd m Fi FC13{ m Fp Fi[2] FC8} FC14{ m FC15{ FL[4]}}} Fp}


 S10103C4 ::~S10103C4(){ note_dtor("S10103C4", this);}
void  S10103C4 ::v12(){vfunc_called(this, "_ZN8S10103C43v12Ev");}
void  S10103C4 ::v13(){vfunc_called(this, "_ZN8S10103C43v13Ev");}
S10103C4 ::S10103C4(){ note_ctor("S10103C4", this);} // tgen

static void Test_S10103C4()
{
  extern Class_Descriptor cd_S10103C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(50,71)];
    init_test(&cd_S10103C4, buf);
    S10103C4 *dp, &lv = *(dp=new (buf) S10103C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(392,280), "sizeof(S10103C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C4)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C4");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C4");
    check_field_offset(lv, s10103c4f0, ABISELECT(168,112), "S10103C4.s10103c4f0");
    check_field_offset(lv, s10103c4f1, ABISELECT(176,116), "S10103C4.s10103c4f1");
    check_field_offset(lv, s10103c4f2, ABISELECT(240,148), "S10103C4.s10103c4f2");
    check_field_offset(lv, s10103c4f3, ABISELECT(248,156), "S10103C4.s10103c4f3");
    check_field_offset(lv, s10103c4f4, ABISELECT(292,200), "S10103C4.s10103c4f4");
    check_field_offset(lv, s10103c4f5, ABISELECT(308,216), "S10103C4.s10103c4f5");
    check_field_offset(lv, s10103c4f6, ABISELECT(312,220), "S10103C4.s10103c4f6");
    check_field_offset(lv, s10103c4f7, ABISELECT(384,276), "S10103C4.s10103c4f7");
    test_class_info(&lv, &cd_S10103C4);
    dp->~S10103C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C4(Test_S10103C4, "S10103C4", ABISELECT(392,280));

#else // __cplusplus

extern void _ZN8S10103C4C1Ev();
extern void _ZN8S10103C4D1Ev();
Name_Map name_map_S10103C4[] = {
  NSPAIR(_ZN8S10103C4C1Ev),
  NSPAIR(_ZN8S10103C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10103C4[];
extern void _ZN8S10103C4D1Ev();
extern void _ZN8S10103C4D0Ev();
extern void _ZN8S10103C43v12Ev();
extern void _ZN8S10103C43v13Ev();
extern void ABISELECT(_ZThn48_N8S10103C4D1Ev,_ZThn32_N8S10103C4D1Ev)();
extern void ABISELECT(_ZThn48_N8S10103C4D0Ev,_ZThn32_N8S10103C4D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10103C4[0]),
  (VTBL_ENTRY)&_ZN8S10103C4D1Ev,
  (VTBL_ENTRY)&_ZN8S10103C4D0Ev,
  (VTBL_ENTRY)&_ZN8S10103C43v12Ev,
  (VTBL_ENTRY)&_ZN8S10103C43v13Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8S10103C4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10103C4D1Ev,_ZThn32_N8S10103C4D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10103C4D0Ev,_ZThn32_N8S10103C4D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI8S10103C4[];
extern  VTBL_ENTRY _ZTV8S10103C4[];
Class_Descriptor cd_S10103C4 = {  "S10103C4", // class name
  bases_S10103C4, 2,
  &(vtc_S10103C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(392,280), // object size
  NSPAIRA(_ZTI8S10103C4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10103C4),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C25_nt  {
  int s10103c25f0[4];
};
//SIG(1 S10103C25_nt) C1{ Fi[4]}



//skip512 S10103C25_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C24  : S10103C5_nt , S10103C12 {
  ::S10103C25_nt s10103c24f0[2];
  ::S10103C25_nt s10103c24f1[2];
  ::S10103C25_nt s10103c24f2[2];
  ::S10103C25_nt s10103c24f3[2];
  virtual  ~S10103C24(); // _ZN9S10103C24D1Ev
  virtual void  v38(); // _ZN9S10103C243v38Ev
  virtual void  v39(); // _ZN9S10103C243v39Ev
  S10103C24(); // tgen
};
//SIG(-1 S10103C24) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 FC11{ Fi[4]}[2] FC11[2] FC11[2] FC11[2]}


 S10103C24 ::~S10103C24(){ note_dtor("S10103C24", this);}
void  S10103C24 ::v38(){vfunc_called(this, "_ZN9S10103C243v38Ev");}
void  S10103C24 ::v39(){vfunc_called(this, "_ZN9S10103C243v39Ev");}
S10103C24 ::S10103C24(){ note_ctor("S10103C24", this);} // tgen

static void Test_S10103C24()
{
  extern Class_Descriptor cd_S10103C24;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(38,61)];
    init_test(&cd_S10103C24, buf);
    S10103C24 *dp, &lv = *(dp=new (buf) S10103C24());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(296,240), "sizeof(S10103C24)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C24)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C24");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C24");
    check_field_offset(lv, s10103c24f0, ABISELECT(168,112), "S10103C24.s10103c24f0");
    check_field_offset(lv, s10103c24f1, ABISELECT(200,144), "S10103C24.s10103c24f1");
    check_field_offset(lv, s10103c24f2, ABISELECT(232,176), "S10103C24.s10103c24f2");
    check_field_offset(lv, s10103c24f3, ABISELECT(264,208), "S10103C24.s10103c24f3");
    test_class_info(&lv, &cd_S10103C24);
    dp->~S10103C24();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C24(Test_S10103C24, "S10103C24", ABISELECT(296,240));

#else // __cplusplus

extern void _ZN9S10103C24C1Ev();
extern void _ZN9S10103C24D1Ev();
Name_Map name_map_S10103C24[] = {
  NSPAIR(_ZN9S10103C24C1Ev),
  NSPAIR(_ZN9S10103C24D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C24[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C24[];
extern void _ZN9S10103C24D1Ev();
extern void _ZN9S10103C24D0Ev();
extern void _ZN9S10103C243v38Ev();
extern void _ZN9S10103C243v39Ev();
extern void ABISELECT(_ZThn48_N9S10103C24D1Ev,_ZThn32_N9S10103C24D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C24D0Ev,_ZThn32_N9S10103C24D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C24[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C24[0]),
  (VTBL_ENTRY)&_ZN9S10103C24D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C24D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C243v38Ev,
  (VTBL_ENTRY)&_ZN9S10103C243v39Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C24[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C24D1Ev,_ZThn32_N9S10103C24D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C24D0Ev,_ZThn32_N9S10103C24D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C24[];
extern  VTBL_ENTRY _ZTV9S10103C24[];
Class_Descriptor cd_S10103C24 = {  "S10103C24", // class name
  bases_S10103C24, 2,
  &(vtc_S10103C24[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(296,240), // object size
  NSPAIRA(_ZTI9S10103C24),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C24),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C26  : S10103C5_nt , S10103C12 {
  void *s10103c26f0[2];
  char s10103c26f1;
  ::S10103C25_nt s10103c26f2[2];
  ::S10103C25_nt s10103c26f3[2];
  ::S10103C25_nt s10103c26f4[2];
  ::S10103C25_nt s10103c26f5[2];
  virtual  ~S10103C26(); // _ZN9S10103C26D1Ev
  virtual void  v40(); // _ZN9S10103C263v40Ev
  virtual void  v41(); // _ZN9S10103C263v41Ev
  virtual void  v42(); // _ZN9S10103C263v42Ev
  virtual void  v43(); // _ZN9S10103C263v43Ev
  S10103C26(); // tgen
};
//SIG(-1 S10103C26) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 Fp[2] Fc FC11{ Fi[4]}[2] FC11[2] FC11[2] FC11[2]}


 S10103C26 ::~S10103C26(){ note_dtor("S10103C26", this);}
void  S10103C26 ::v40(){vfunc_called(this, "_ZN9S10103C263v40Ev");}
void  S10103C26 ::v41(){vfunc_called(this, "_ZN9S10103C263v41Ev");}
void  S10103C26 ::v42(){vfunc_called(this, "_ZN9S10103C263v42Ev");}
void  S10103C26 ::v43(){vfunc_called(this, "_ZN9S10103C263v43Ev");}
S10103C26 ::S10103C26(){ note_ctor("S10103C26", this);} // tgen

static void Test_S10103C26()
{
  extern Class_Descriptor cd_S10103C26;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(41,64)];
    init_test(&cd_S10103C26, buf);
    S10103C26 *dp, &lv = *(dp=new (buf) S10103C26());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(320,252), "sizeof(S10103C26)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C26)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C26");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C26");
    check_field_offset(lv, s10103c26f0, ABISELECT(168,112), "S10103C26.s10103c26f0");
    check_field_offset(lv, s10103c26f1, ABISELECT(184,120), "S10103C26.s10103c26f1");
    check_field_offset(lv, s10103c26f2, ABISELECT(188,124), "S10103C26.s10103c26f2");
    check_field_offset(lv, s10103c26f3, ABISELECT(220,156), "S10103C26.s10103c26f3");
    check_field_offset(lv, s10103c26f4, ABISELECT(252,188), "S10103C26.s10103c26f4");
    check_field_offset(lv, s10103c26f5, ABISELECT(284,220), "S10103C26.s10103c26f5");
    test_class_info(&lv, &cd_S10103C26);
    dp->~S10103C26();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C26(Test_S10103C26, "S10103C26", ABISELECT(320,252));

#else // __cplusplus

extern void _ZN9S10103C26C1Ev();
extern void _ZN9S10103C26D1Ev();
Name_Map name_map_S10103C26[] = {
  NSPAIR(_ZN9S10103C26C1Ev),
  NSPAIR(_ZN9S10103C26D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C26[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C26[];
extern void _ZN9S10103C26D1Ev();
extern void _ZN9S10103C26D0Ev();
extern void _ZN9S10103C263v40Ev();
extern void _ZN9S10103C263v41Ev();
extern void _ZN9S10103C263v42Ev();
extern void _ZN9S10103C263v43Ev();
extern void ABISELECT(_ZThn48_N9S10103C26D1Ev,_ZThn32_N9S10103C26D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C26D0Ev,_ZThn32_N9S10103C26D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C26[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C26[0]),
  (VTBL_ENTRY)&_ZN9S10103C26D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C26D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C263v40Ev,
  (VTBL_ENTRY)&_ZN9S10103C263v41Ev,
  (VTBL_ENTRY)&_ZN9S10103C263v42Ev,
  (VTBL_ENTRY)&_ZN9S10103C263v43Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C26[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C26D1Ev,_ZThn32_N9S10103C26D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C26D0Ev,_ZThn32_N9S10103C26D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C26[];
extern  VTBL_ENTRY _ZTV9S10103C26[];
Class_Descriptor cd_S10103C26 = {  "S10103C26", // class name
  bases_S10103C26, 2,
  &(vtc_S10103C26[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(320,252), // object size
  NSPAIRA(_ZTI9S10103C26),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C26),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C28  : S10103C5_nt , S10103C12 {
  virtual  ~S10103C28(); // _ZN9S10103C28D1Ev
  virtual void  v47(); // _ZN9S10103C283v47Ev
  virtual void  v48(); // _ZN9S10103C283v48Ev
  virtual void  v49(); // _ZN9S10103C283v49Ev
  virtual void  v50(); // _ZN9S10103C283v50Ev
  virtual void  v51(); // _ZN9S10103C283v51Ev
  virtual void  v52(); // _ZN9S10103C283v52Ev
  virtual void  v53(); // _ZN9S10103C283v53Ev
  virtual void  v54(); // _ZN9S10103C283v54Ev
  virtual void  v55(); // _ZN9S10103C283v55Ev
  S10103C28(); // tgen
};
//SIG(-1 S10103C28) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 v5 v6 v7 v8 v9}


 S10103C28 ::~S10103C28(){ note_dtor("S10103C28", this);}
void  S10103C28 ::v47(){vfunc_called(this, "_ZN9S10103C283v47Ev");}
void  S10103C28 ::v48(){vfunc_called(this, "_ZN9S10103C283v48Ev");}
void  S10103C28 ::v49(){vfunc_called(this, "_ZN9S10103C283v49Ev");}
void  S10103C28 ::v50(){vfunc_called(this, "_ZN9S10103C283v50Ev");}
void  S10103C28 ::v51(){vfunc_called(this, "_ZN9S10103C283v51Ev");}
void  S10103C28 ::v52(){vfunc_called(this, "_ZN9S10103C283v52Ev");}
void  S10103C28 ::v53(){vfunc_called(this, "_ZN9S10103C283v53Ev");}
void  S10103C28 ::v54(){vfunc_called(this, "_ZN9S10103C283v54Ev");}
void  S10103C28 ::v55(){vfunc_called(this, "_ZN9S10103C283v55Ev");}
S10103C28 ::S10103C28(){ note_ctor("S10103C28", this);} // tgen

static void Test_S10103C28()
{
  extern Class_Descriptor cd_S10103C28;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(22,29)];
    init_test(&cd_S10103C28, buf);
    S10103C28 *dp, &lv = *(dp=new (buf) S10103C28());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(168,112), "sizeof(S10103C28)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C28)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C28");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C28");
    test_class_info(&lv, &cd_S10103C28);
    dp->~S10103C28();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C28(Test_S10103C28, "S10103C28", ABISELECT(168,112));

#else // __cplusplus

extern void _ZN9S10103C28C1Ev();
extern void _ZN9S10103C28D1Ev();
Name_Map name_map_S10103C28[] = {
  NSPAIR(_ZN9S10103C28C1Ev),
  NSPAIR(_ZN9S10103C28D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C28[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C28[];
extern void _ZN9S10103C28D1Ev();
extern void _ZN9S10103C28D0Ev();
extern void _ZN9S10103C283v47Ev();
extern void _ZN9S10103C283v48Ev();
extern void _ZN9S10103C283v49Ev();
extern void _ZN9S10103C283v50Ev();
extern void _ZN9S10103C283v51Ev();
extern void _ZN9S10103C283v52Ev();
extern void _ZN9S10103C283v53Ev();
extern void _ZN9S10103C283v54Ev();
extern void _ZN9S10103C283v55Ev();
extern void ABISELECT(_ZThn48_N9S10103C28D1Ev,_ZThn32_N9S10103C28D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C28D0Ev,_ZThn32_N9S10103C28D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C28[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C28[0]),
  (VTBL_ENTRY)&_ZN9S10103C28D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C28D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v47Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v48Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v49Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v50Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v51Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v52Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v53Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v54Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v55Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C28D1Ev,_ZThn32_N9S10103C28D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C28D0Ev,_ZThn32_N9S10103C28D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C28[];
extern  VTBL_ENTRY _ZTV9S10103C28[];
Class_Descriptor cd_S10103C28 = {  "S10103C28", // class name
  bases_S10103C28, 2,
  &(vtc_S10103C28[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(168,112), // object size
  NSPAIRA(_ZTI9S10103C28),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C28),41, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C29  {
  int s10103c29f0;
  void *s10103c29f1;
  int s10103c29f2;
  void *s10103c29f3[2];
  int s10103c29f4;
  void  mf10103c29(); // _ZN9S10103C2910mf10103c29Ev
};
//SIG(-1 S10103C29) C1{ m Fi Fp Fi Fp[2] Fi}


void  S10103C29 ::mf10103c29(){}

static void Test_S10103C29()
{
  {
    init_simple_test("S10103C29");
    S10103C29 lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(S10103C29)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C29)");
    check_field_offset(lv, s10103c29f0, 0, "S10103C29.s10103c29f0");
    check_field_offset(lv, s10103c29f1, ABISELECT(8,4), "S10103C29.s10103c29f1");
    check_field_offset(lv, s10103c29f2, ABISELECT(16,8), "S10103C29.s10103c29f2");
    check_field_offset(lv, s10103c29f3, ABISELECT(24,12), "S10103C29.s10103c29f3");
    check_field_offset(lv, s10103c29f4, ABISELECT(40,20), "S10103C29.s10103c29f4");
  }
}
static Arrange_To_Call_Me vS10103C29(Test_S10103C29, "S10103C29", ABISELECT(48,24));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C31_nt  {
  __tsi64 s10103c31f0;
  void  mf10103c31(); // _ZN12S10103C31_nt10mf10103c31Ev
};
//SIG(-1 S10103C31_nt) C1{ m FL}


void  S10103C31_nt ::mf10103c31(){}

//skip512 S10103C31_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C30_nt  {
  ::S10103C31_nt s10103c30f0;
  void  mf10103c30(); // _ZN12S10103C30_nt10mf10103c30Ev
};
//SIG(-1 S10103C30_nt) C1{ m FC2{ m FL}}


void  S10103C30_nt ::mf10103c30(){}

//skip512 S10103C30_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C27  : S10103C28 {
  int s10103c27f0[2];
  ::S10103C29 s10103c27f1;
  ::S10103C14_nt s10103c27f2;
  ::S10103C14_nt s10103c27f3;
  ::S10103C14_nt s10103c27f4;
  ::S10103C14_nt s10103c27f5;
  ::S10103C30_nt s10103c27f6;
  __tsi64 s10103c27f7;
  int s10103c27f8;
  void *s10103c27f9;
  int s10103c27f10;
  char s10103c27f11;
  virtual  ~S10103C27(); // _ZN9S10103C27D1Ev
  virtual void  v44(); // _ZN9S10103C273v44Ev
  virtual void  v45(); // _ZN9S10103C273v45Ev
  virtual void  v46(); // _ZN9S10103C273v46Ev
  S10103C27(); // tgen
};
//SIG(-1 S10103C27) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v28 v29 v30 v31 v32 v33 v34 v35 v36} vd v1 v2 v3 Fi[2] FC12{ m Fi Fp Fi Fp[2] Fi} FC8 FC8 FC8 FC8 FC13{ m FC14{ m FL}} FL Fi Fp Fi Fc}


 S10103C27 ::~S10103C27(){ note_dtor("S10103C27", this);}
void  S10103C27 ::v44(){vfunc_called(this, "_ZN9S10103C273v44Ev");}
void  S10103C27 ::v45(){vfunc_called(this, "_ZN9S10103C273v45Ev");}
void  S10103C27 ::v46(){vfunc_called(this, "_ZN9S10103C273v46Ev");}
S10103C27 ::S10103C27(){ note_ctor("S10103C27", this);} // tgen

static void Test_S10103C27()
{
  extern Class_Descriptor cd_S10103C27;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(42,57)];
    init_test(&cd_S10103C27, buf);
    S10103C27 *dp, &lv = *(dp=new (buf) S10103C27());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(328,224), "sizeof(S10103C27)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C27)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C28*), 0, "S10103C27");
    check_base_class_offset(lv, (S10103C12*)(S10103C28*), ABISELECT(48,32), "S10103C27");
    check_base_class_offset(lv, (S10103C28*), 0, "S10103C27");
    check_field_offset(lv, s10103c27f0, ABISELECT(168,112), "S10103C27.s10103c27f0");
    check_field_offset(lv, s10103c27f1, ABISELECT(176,120), "S10103C27.s10103c27f1");
    check_field_offset(lv, s10103c27f2, ABISELECT(224,144), "S10103C27.s10103c27f2");
    check_field_offset(lv, s10103c27f3, ABISELECT(240,156), "S10103C27.s10103c27f3");
    check_field_offset(lv, s10103c27f4, ABISELECT(256,168), "S10103C27.s10103c27f4");
    check_field_offset(lv, s10103c27f5, ABISELECT(272,180), "S10103C27.s10103c27f5");
    check_field_offset(lv, s10103c27f6, ABISELECT(288,192), "S10103C27.s10103c27f6");
    check_field_offset(lv, s10103c27f7, ABISELECT(296,200), "S10103C27.s10103c27f7");
    check_field_offset(lv, s10103c27f8, ABISELECT(304,208), "S10103C27.s10103c27f8");
    check_field_offset(lv, s10103c27f9, ABISELECT(312,212), "S10103C27.s10103c27f9");
    check_field_offset(lv, s10103c27f10, ABISELECT(320,216), "S10103C27.s10103c27f10");
    check_field_offset(lv, s10103c27f11, ABISELECT(324,220), "S10103C27.s10103c27f11");
    test_class_info(&lv, &cd_S10103C27);
    dp->~S10103C27();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C27(Test_S10103C27, "S10103C27", ABISELECT(328,224));

#else // __cplusplus

extern void _ZN9S10103C27C1Ev();
extern void _ZN9S10103C27D1Ev();
Name_Map name_map_S10103C27[] = {
  NSPAIR(_ZN9S10103C27C1Ev),
  NSPAIR(_ZN9S10103C27D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
extern Class_Descriptor cd_S10103C28;
extern VTBL_ENTRY _ZTI9S10103C28[];
extern  VTBL_ENTRY _ZTV9S10103C28[];
static Base_Class bases_S10103C27[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C27[];
extern void _ZN9S10103C27D1Ev();
extern void _ZN9S10103C27D0Ev();
extern void _ZN9S10103C283v47Ev();
extern void _ZN9S10103C283v48Ev();
extern void _ZN9S10103C283v49Ev();
extern void _ZN9S10103C283v50Ev();
extern void _ZN9S10103C283v51Ev();
extern void _ZN9S10103C283v52Ev();
extern void _ZN9S10103C283v53Ev();
extern void _ZN9S10103C283v54Ev();
extern void _ZN9S10103C283v55Ev();
extern void _ZN9S10103C273v44Ev();
extern void _ZN9S10103C273v45Ev();
extern void _ZN9S10103C273v46Ev();
extern void ABISELECT(_ZThn48_N9S10103C27D1Ev,_ZThn32_N9S10103C27D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C27D0Ev,_ZThn32_N9S10103C27D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C27[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C27[0]),
  (VTBL_ENTRY)&_ZN9S10103C27D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C27D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v47Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v48Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v49Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v50Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v51Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v52Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v53Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v54Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v55Ev,
  (VTBL_ENTRY)&_ZN9S10103C273v44Ev,
  (VTBL_ENTRY)&_ZN9S10103C273v45Ev,
  (VTBL_ENTRY)&_ZN9S10103C273v46Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C27D1Ev,_ZThn32_N9S10103C27D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C27D0Ev,_ZThn32_N9S10103C27D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C27[];
extern  VTBL_ENTRY _ZTV9S10103C27[];
Class_Descriptor cd_S10103C27 = {  "S10103C27", // class name
  bases_S10103C27, 3,
  &(vtc_S10103C27[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(328,224), // object size
  NSPAIRA(_ZTI9S10103C27),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C27),44, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C32  : S10103C28 {
  ::S10103C29 s10103c32f0;
  ::S10103C14_nt s10103c32f1;
  ::S10103C14_nt s10103c32f2;
  void *s10103c32f3;
  int s10103c32f4;
  virtual  ~S10103C32(); // _ZN9S10103C32D1Ev
  virtual void  v56(); // _ZN9S10103C323v56Ev
  virtual void  v57(); // _ZN9S10103C323v57Ev
  virtual void  v58(); // _ZN9S10103C323v58Ev
  S10103C32(); // tgen
};
//SIG(-1 S10103C32) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v28 v29 v30 v31 v32 v33 v34 v35 v36} vd v1 v2 v3 FC12{ m Fi Fp Fi Fp[2] Fi} FC8 FC8 Fp Fi}


 S10103C32 ::~S10103C32(){ note_dtor("S10103C32", this);}
void  S10103C32 ::v56(){vfunc_called(this, "_ZN9S10103C323v56Ev");}
void  S10103C32 ::v57(){vfunc_called(this, "_ZN9S10103C323v57Ev");}
void  S10103C32 ::v58(){vfunc_called(this, "_ZN9S10103C323v58Ev");}
S10103C32 ::S10103C32(){ note_ctor("S10103C32", this);} // tgen

static void Test_S10103C32()
{
  extern Class_Descriptor cd_S10103C32;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(34,43)];
    init_test(&cd_S10103C32, buf);
    S10103C32 *dp, &lv = *(dp=new (buf) S10103C32());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(264,168), "sizeof(S10103C32)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C32)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C28*), 0, "S10103C32");
    check_base_class_offset(lv, (S10103C12*)(S10103C28*), ABISELECT(48,32), "S10103C32");
    check_base_class_offset(lv, (S10103C28*), 0, "S10103C32");
    check_field_offset(lv, s10103c32f0, ABISELECT(168,112), "S10103C32.s10103c32f0");
    check_field_offset(lv, s10103c32f1, ABISELECT(216,136), "S10103C32.s10103c32f1");
    check_field_offset(lv, s10103c32f2, ABISELECT(232,148), "S10103C32.s10103c32f2");
    check_field_offset(lv, s10103c32f3, ABISELECT(248,160), "S10103C32.s10103c32f3");
    check_field_offset(lv, s10103c32f4, ABISELECT(256,164), "S10103C32.s10103c32f4");
    test_class_info(&lv, &cd_S10103C32);
    dp->~S10103C32();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C32(Test_S10103C32, "S10103C32", ABISELECT(264,168));

#else // __cplusplus

extern void _ZN9S10103C32C1Ev();
extern void _ZN9S10103C32D1Ev();
Name_Map name_map_S10103C32[] = {
  NSPAIR(_ZN9S10103C32C1Ev),
  NSPAIR(_ZN9S10103C32D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
extern Class_Descriptor cd_S10103C28;
extern VTBL_ENTRY _ZTI9S10103C28[];
extern  VTBL_ENTRY _ZTV9S10103C28[];
static Base_Class bases_S10103C32[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C32[];
extern void _ZN9S10103C32D1Ev();
extern void _ZN9S10103C32D0Ev();
extern void _ZN9S10103C283v47Ev();
extern void _ZN9S10103C283v48Ev();
extern void _ZN9S10103C283v49Ev();
extern void _ZN9S10103C283v50Ev();
extern void _ZN9S10103C283v51Ev();
extern void _ZN9S10103C283v52Ev();
extern void _ZN9S10103C283v53Ev();
extern void _ZN9S10103C283v54Ev();
extern void _ZN9S10103C283v55Ev();
extern void _ZN9S10103C323v56Ev();
extern void _ZN9S10103C323v57Ev();
extern void _ZN9S10103C323v58Ev();
extern void ABISELECT(_ZThn48_N9S10103C32D1Ev,_ZThn32_N9S10103C32D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C32D0Ev,_ZThn32_N9S10103C32D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C32[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C32[0]),
  (VTBL_ENTRY)&_ZN9S10103C32D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C32D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v47Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v48Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v49Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v50Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v51Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v52Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v53Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v54Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v55Ev,
  (VTBL_ENTRY)&_ZN9S10103C323v56Ev,
  (VTBL_ENTRY)&_ZN9S10103C323v57Ev,
  (VTBL_ENTRY)&_ZN9S10103C323v58Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C32[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C32D1Ev,_ZThn32_N9S10103C32D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C32D0Ev,_ZThn32_N9S10103C32D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C32[];
extern  VTBL_ENTRY _ZTV9S10103C32[];
Class_Descriptor cd_S10103C32 = {  "S10103C32", // class name
  bases_S10103C32, 3,
  &(vtc_S10103C32[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(264,168), // object size
  NSPAIRA(_ZTI9S10103C32),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C32),44, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C33  : S10103C5_nt , S10103C12 {
  void *s10103c33f0;
  virtual  ~S10103C33(); // _ZN9S10103C33D1Ev
  virtual void  v59(); // _ZN9S10103C333v59Ev
  virtual void  v60(); // _ZN9S10103C333v60Ev
  virtual void  v61(); // _ZN9S10103C333v61Ev
  S10103C33(); // tgen
};
//SIG(-1 S10103C33) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 Fp}


 S10103C33 ::~S10103C33(){ note_dtor("S10103C33", this);}
void  S10103C33 ::v59(){vfunc_called(this, "_ZN9S10103C333v59Ev");}
void  S10103C33 ::v60(){vfunc_called(this, "_ZN9S10103C333v60Ev");}
void  S10103C33 ::v61(){vfunc_called(this, "_ZN9S10103C333v61Ev");}
S10103C33 ::S10103C33(){ note_ctor("S10103C33", this);} // tgen

static void Test_S10103C33()
{
  extern Class_Descriptor cd_S10103C33;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(23,30)];
    init_test(&cd_S10103C33, buf);
    S10103C33 *dp, &lv = *(dp=new (buf) S10103C33());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(176,116), "sizeof(S10103C33)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C33)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C33");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C33");
    check_field_offset(lv, s10103c33f0, ABISELECT(168,112), "S10103C33.s10103c33f0");
    test_class_info(&lv, &cd_S10103C33);
    dp->~S10103C33();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C33(Test_S10103C33, "S10103C33", ABISELECT(176,116));

#else // __cplusplus

extern void _ZN9S10103C33C1Ev();
extern void _ZN9S10103C33D1Ev();
Name_Map name_map_S10103C33[] = {
  NSPAIR(_ZN9S10103C33C1Ev),
  NSPAIR(_ZN9S10103C33D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C33[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C33[];
extern void _ZN9S10103C33D1Ev();
extern void _ZN9S10103C33D0Ev();
extern void _ZN9S10103C333v59Ev();
extern void _ZN9S10103C333v60Ev();
extern void _ZN9S10103C333v61Ev();
extern void ABISELECT(_ZThn48_N9S10103C33D1Ev,_ZThn32_N9S10103C33D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C33D0Ev,_ZThn32_N9S10103C33D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C33[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C33[0]),
  (VTBL_ENTRY)&_ZN9S10103C33D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C33D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C333v59Ev,
  (VTBL_ENTRY)&_ZN9S10103C333v60Ev,
  (VTBL_ENTRY)&_ZN9S10103C333v61Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C33[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C33D1Ev,_ZThn32_N9S10103C33D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C33D0Ev,_ZThn32_N9S10103C33D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C33[];
extern  VTBL_ENTRY _ZTV9S10103C33[];
Class_Descriptor cd_S10103C33 = {  "S10103C33", // class name
  bases_S10103C33, 2,
  &(vtc_S10103C33[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(176,116), // object size
  NSPAIRA(_ZTI9S10103C33),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C33),35, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C36  {
  void  mf10103c36(); // _ZN9S10103C3610mf10103c36Ev
};
//SIG(-1 S10103C36) C1{ m}


void  S10103C36 ::mf10103c36(){}

static void Test_S10103C36()
{
  {
    init_simple_test("S10103C36");
    S10103C36 lv;
    check2(sizeof(lv), 1, "sizeof(S10103C36)");
    check2(__alignof__(lv), 1, "__alignof__(S10103C36)");
  }
}
static Arrange_To_Call_Me vS10103C36(Test_S10103C36, "S10103C36", 1);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C35  {
  void *s10103c35f0;
  int s10103c35f1;
  ::S10103C36 s10103c35f2;
  ::S10103C36 s10103c35f3;
  void  mf10103c35(); // _ZN9S10103C3510mf10103c35Ev
};
//SIG(-1 S10103C35) C1{ m Fp Fi FC2{ m} FC2}


void  S10103C35 ::mf10103c35(){}

static void Test_S10103C35()
{
  {
    init_simple_test("S10103C35");
    S10103C35 lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(S10103C35)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C35)");
    check_field_offset(lv, s10103c35f0, 0, "S10103C35.s10103c35f0");
    check_field_offset(lv, s10103c35f1, ABISELECT(8,4), "S10103C35.s10103c35f1");
    check_field_offset(lv, s10103c35f2, ABISELECT(12,8), "S10103C35.s10103c35f2");
    check_field_offset(lv, s10103c35f3, ABISELECT(13,9), "S10103C35.s10103c35f3");
  }
}
static Arrange_To_Call_Me vS10103C35(Test_S10103C35, "S10103C35", ABISELECT(16,12));

#else // __cplusplus

Class_Descriptor cd_S10103C35 = {  "S10103C35", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(16,12), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C34  : S10103C5_nt , S10103C12 {
  void *s10103c34f0;
  ::S10103C35 s10103c34f1;
  ::S10103C14_nt s10103c34f2;
  ::S10103C14_nt s10103c34f3;
  int s10103c34f4[2];
  char s10103c34f5;
  int s10103c34f6[2];
  virtual  ~S10103C34(); // _ZN9S10103C34D1Ev
  virtual void  v62(); // _ZN9S10103C343v62Ev
  virtual void  v63(); // _ZN9S10103C343v63Ev
  S10103C34(); // tgen
};
//SIG(-1 S10103C34) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 Fp FC11{ m Fp Fi FC12{ m} FC12} FC7 FC7 Fi[2] Fc Fi[2]}


 S10103C34 ::~S10103C34(){ note_dtor("S10103C34", this);}
void  S10103C34 ::v62(){vfunc_called(this, "_ZN9S10103C343v62Ev");}
void  S10103C34 ::v63(){vfunc_called(this, "_ZN9S10103C343v63Ev");}
S10103C34 ::S10103C34(){ note_ctor("S10103C34", this);} // tgen

static void Test_S10103C34()
{
  extern Class_Descriptor cd_S10103C34;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(32,44)];
    init_test(&cd_S10103C34, buf);
    S10103C34 *dp, &lv = *(dp=new (buf) S10103C34());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(248,172), "sizeof(S10103C34)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C34)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C34");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C34");
    check_field_offset(lv, s10103c34f0, ABISELECT(168,112), "S10103C34.s10103c34f0");
    check_field_offset(lv, s10103c34f1, ABISELECT(176,116), "S10103C34.s10103c34f1");
    check_field_offset(lv, s10103c34f2, ABISELECT(192,128), "S10103C34.s10103c34f2");
    check_field_offset(lv, s10103c34f3, ABISELECT(208,140), "S10103C34.s10103c34f3");
    check_field_offset(lv, s10103c34f4, ABISELECT(224,152), "S10103C34.s10103c34f4");
    check_field_offset(lv, s10103c34f5, ABISELECT(232,160), "S10103C34.s10103c34f5");
    check_field_offset(lv, s10103c34f6, ABISELECT(236,164), "S10103C34.s10103c34f6");
    test_class_info(&lv, &cd_S10103C34);
    dp->~S10103C34();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C34(Test_S10103C34, "S10103C34", ABISELECT(248,172));

#else // __cplusplus

extern void _ZN9S10103C34C1Ev();
extern void _ZN9S10103C34D1Ev();
Name_Map name_map_S10103C34[] = {
  NSPAIR(_ZN9S10103C34C1Ev),
  NSPAIR(_ZN9S10103C34D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C34[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C34[];
extern void _ZN9S10103C34D1Ev();
extern void _ZN9S10103C34D0Ev();
extern void _ZN9S10103C343v62Ev();
extern void _ZN9S10103C343v63Ev();
extern void ABISELECT(_ZThn48_N9S10103C34D1Ev,_ZThn32_N9S10103C34D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C34D0Ev,_ZThn32_N9S10103C34D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C34[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C34[0]),
  (VTBL_ENTRY)&_ZN9S10103C34D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C34D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C343v62Ev,
  (VTBL_ENTRY)&_ZN9S10103C343v63Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C34[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C34D1Ev,_ZThn32_N9S10103C34D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C34D0Ev,_ZThn32_N9S10103C34D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C34[];
extern  VTBL_ENTRY _ZTV9S10103C34[];
Class_Descriptor cd_S10103C34 = {  "S10103C34", // class name
  bases_S10103C34, 2,
  &(vtc_S10103C34[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(248,172), // object size
  NSPAIRA(_ZTI9S10103C34),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C34),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C38  : S10103C5_nt {
  char s10103c38f0;
  void *s10103c38f1[2];
  virtual  ~S10103C38(); // _ZN9S10103C38D1Ev
  S10103C38(); // tgen
};
//SIG(-1 S10103C38) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd Fc Fp[2]}


 S10103C38 ::~S10103C38(){ note_dtor("S10103C38", this);}
S10103C38 ::S10103C38(){ note_ctor("S10103C38", this);} // tgen

static void Test_S10103C38()
{
  extern Class_Descriptor cd_S10103C38;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S10103C38, buf);
    S10103C38 *dp, &lv = *(dp=new (buf) S10103C38());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S10103C38)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C38)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C38");
    check_field_offset(lv, s10103c38f0, ABISELECT(41,29), "S10103C38.s10103c38f0");
    check_field_offset(lv, s10103c38f1, ABISELECT(48,32), "S10103C38.s10103c38f1");
    test_class_info(&lv, &cd_S10103C38);
    dp->~S10103C38();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C38(Test_S10103C38, "S10103C38", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN9S10103C38C1Ev();
extern void _ZN9S10103C38D1Ev();
Name_Map name_map_S10103C38[] = {
  NSPAIR(_ZN9S10103C38C1Ev),
  NSPAIR(_ZN9S10103C38D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10103C38[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C38[];
extern void _ZN9S10103C38D1Ev();
extern void _ZN9S10103C38D0Ev();
static  VTBL_ENTRY vtc_S10103C38[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C38[0]),
  (VTBL_ENTRY)&_ZN9S10103C38D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C38D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C38[];
extern  VTBL_ENTRY _ZTV9S10103C38[];
Class_Descriptor cd_S10103C38 = {  "S10103C38", // class name
  bases_S10103C38, 1,
  &(vtc_S10103C38[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI9S10103C38),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C38),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C39  : S10103C5_nt , S10103C12 {
  char s10103c39f0;
  virtual  ~S10103C39(); // _ZN9S10103C39D1Ev
  virtual void  v64(); // _ZN9S10103C393v64Ev
  virtual void  v65(); // _ZN9S10103C393v65Ev
  virtual void  v66(); // _ZN9S10103C393v66Ev
  virtual void  v67(); // _ZN9S10103C393v67Ev
  virtual void  v68(); // _ZN9S10103C393v68Ev
  S10103C39(); // tgen
};
//SIG(-1 S10103C39) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 v5 Fc}


 S10103C39 ::~S10103C39(){ note_dtor("S10103C39", this);}
void  S10103C39 ::v64(){vfunc_called(this, "_ZN9S10103C393v64Ev");}
void  S10103C39 ::v65(){vfunc_called(this, "_ZN9S10103C393v65Ev");}
void  S10103C39 ::v66(){vfunc_called(this, "_ZN9S10103C393v66Ev");}
void  S10103C39 ::v67(){vfunc_called(this, "_ZN9S10103C393v67Ev");}
void  S10103C39 ::v68(){vfunc_called(this, "_ZN9S10103C393v68Ev");}
S10103C39 ::S10103C39(){ note_ctor("S10103C39", this);} // tgen

static void Test_S10103C39()
{
  extern Class_Descriptor cd_S10103C39;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(23,30)];
    init_test(&cd_S10103C39, buf);
    S10103C39 *dp, &lv = *(dp=new (buf) S10103C39());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(176,116), "sizeof(S10103C39)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C39)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C39");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C39");
    check_field_offset(lv, s10103c39f0, ABISELECT(168,112), "S10103C39.s10103c39f0");
    test_class_info(&lv, &cd_S10103C39);
    dp->~S10103C39();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C39(Test_S10103C39, "S10103C39", ABISELECT(176,116));

#else // __cplusplus

extern void _ZN9S10103C39C1Ev();
extern void _ZN9S10103C39D1Ev();
Name_Map name_map_S10103C39[] = {
  NSPAIR(_ZN9S10103C39C1Ev),
  NSPAIR(_ZN9S10103C39D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C39[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C39[];
extern void _ZN9S10103C39D1Ev();
extern void _ZN9S10103C39D0Ev();
extern void _ZN9S10103C393v64Ev();
extern void _ZN9S10103C393v65Ev();
extern void _ZN9S10103C393v66Ev();
extern void _ZN9S10103C393v67Ev();
extern void _ZN9S10103C393v68Ev();
extern void ABISELECT(_ZThn48_N9S10103C39D1Ev,_ZThn32_N9S10103C39D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C39D0Ev,_ZThn32_N9S10103C39D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C39[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C39[0]),
  (VTBL_ENTRY)&_ZN9S10103C39D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C39D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C393v64Ev,
  (VTBL_ENTRY)&_ZN9S10103C393v65Ev,
  (VTBL_ENTRY)&_ZN9S10103C393v66Ev,
  (VTBL_ENTRY)&_ZN9S10103C393v67Ev,
  (VTBL_ENTRY)&_ZN9S10103C393v68Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C39[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C39D1Ev,_ZThn32_N9S10103C39D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C39D0Ev,_ZThn32_N9S10103C39D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C39[];
extern  VTBL_ENTRY _ZTV9S10103C39[];
Class_Descriptor cd_S10103C39 = {  "S10103C39", // class name
  bases_S10103C39, 2,
  &(vtc_S10103C39[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(176,116), // object size
  NSPAIRA(_ZTI9S10103C39),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C39),37, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C42  {
  void *s10103c42f0;
  ::S10103C13_nt s10103c42f1;
  ::S10103C14_nt s10103c42f2;
  ::S10103C14_nt s10103c42f3;
  int s10103c42f4;
  void  mf10103c42(); // _ZN9S10103C4210mf10103c42Ev
};
//SIG(-1 S10103C42) C1{ m Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC3 FC3 Fi}


void  S10103C42 ::mf10103c42(){}

static void Test_S10103C42()
{
  {
    init_simple_test("S10103C42");
    S10103C42 lv;
    check2(sizeof(lv), ABISELECT(72,48), "sizeof(S10103C42)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C42)");
    check_field_offset(lv, s10103c42f0, 0, "S10103C42.s10103c42f0");
    check_field_offset(lv, s10103c42f1, ABISELECT(8,4), "S10103C42.s10103c42f1");
    check_field_offset(lv, s10103c42f2, ABISELECT(32,20), "S10103C42.s10103c42f2");
    check_field_offset(lv, s10103c42f3, ABISELECT(48,32), "S10103C42.s10103c42f3");
    check_field_offset(lv, s10103c42f4, ABISELECT(64,44), "S10103C42.s10103c42f4");
  }
}
static Arrange_To_Call_Me vS10103C42(Test_S10103C42, "S10103C42", ABISELECT(72,48));

#else // __cplusplus

Class_Descriptor cd_S10103C42 = {  "S10103C42", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(72,48), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C41  : S10103C5_nt {
  ::S10103C42 s10103c41f0;
  void *s10103c41f1;
  char s10103c41f2;
  int s10103c41f3;
  virtual  ~S10103C41(); // _ZN9S10103C41D1Ev
  virtual void  v71(); // _ZN9S10103C413v71Ev
  virtual void  v72(); // _ZN9S10103C413v72Ev
  virtual void  v73(); // _ZN9S10103C413v73Ev
  virtual void  v74(); // _ZN9S10103C413v74Ev
  S10103C41(); // tgen
};
//SIG(-1 S10103C41) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd v1 v2 v3 v4 FC5{ m Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC7 FC7 Fi} Fp Fc Fi}


 S10103C41 ::~S10103C41(){ note_dtor("S10103C41", this);}
void  S10103C41 ::v71(){vfunc_called(this, "_ZN9S10103C413v71Ev");}
void  S10103C41 ::v72(){vfunc_called(this, "_ZN9S10103C413v72Ev");}
void  S10103C41 ::v73(){vfunc_called(this, "_ZN9S10103C413v73Ev");}
void  S10103C41 ::v74(){vfunc_called(this, "_ZN9S10103C413v74Ev");}
S10103C41 ::S10103C41(){ note_ctor("S10103C41", this);} // tgen

static void Test_S10103C41()
{
  extern Class_Descriptor cd_S10103C41;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10103C41, buf);
    S10103C41 *dp, &lv = *(dp=new (buf) S10103C41());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10103C41)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C41)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C41");
    check_field_offset(lv, s10103c41f0, ABISELECT(48,32), "S10103C41.s10103c41f0");
    check_field_offset(lv, s10103c41f1, ABISELECT(120,80), "S10103C41.s10103c41f1");
    check_field_offset(lv, s10103c41f2, ABISELECT(128,84), "S10103C41.s10103c41f2");
    check_field_offset(lv, s10103c41f3, ABISELECT(132,88), "S10103C41.s10103c41f3");
    test_class_info(&lv, &cd_S10103C41);
    dp->~S10103C41();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C41(Test_S10103C41, "S10103C41", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10103C41C1Ev();
extern void _ZN9S10103C41D1Ev();
Name_Map name_map_S10103C41[] = {
  NSPAIR(_ZN9S10103C41C1Ev),
  NSPAIR(_ZN9S10103C41D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10103C41[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C41[];
extern void _ZN9S10103C41D1Ev();
extern void _ZN9S10103C41D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
static  VTBL_ENTRY vtc_S10103C41[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C41[0]),
  (VTBL_ENTRY)&_ZN9S10103C41D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C41D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
};
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
Class_Descriptor cd_S10103C41 = {  "S10103C41", // class name
  bases_S10103C41, 1,
  &(vtc_S10103C41[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10103C41),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C41),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C40  : S10103C41 {
  virtual void  v69(); // _ZN9S10103C403v69Ev
  virtual void  v70(); // _ZN9S10103C403v70Ev
  ~S10103C40(); // tgen
  S10103C40(); // tgen
};
//SIG(-1 S10103C40) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v3 v4 v5 v6 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1 v2}


void  S10103C40 ::v69(){vfunc_called(this, "_ZN9S10103C403v69Ev");}
void  S10103C40 ::v70(){vfunc_called(this, "_ZN9S10103C403v70Ev");}
S10103C40 ::~S10103C40(){ note_dtor("S10103C40", this);} // tgen
S10103C40 ::S10103C40(){ note_ctor("S10103C40", this);} // tgen

static void Test_S10103C40()
{
  extern Class_Descriptor cd_S10103C40;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10103C40, buf);
    S10103C40 *dp, &lv = *(dp=new (buf) S10103C40());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10103C40)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C40)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C41*), 0, "S10103C40");
    check_base_class_offset(lv, (S10103C41*), 0, "S10103C40");
    test_class_info(&lv, &cd_S10103C40);
    dp->~S10103C40();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C40(Test_S10103C40, "S10103C40", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10103C40C1Ev();
extern void _ZN9S10103C40D1Ev();
Name_Map name_map_S10103C40[] = {
  NSPAIR(_ZN9S10103C40C1Ev),
  NSPAIR(_ZN9S10103C40D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C41;
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
static Base_Class bases_S10103C40[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C40[];
extern void _ZN9S10103C40D1Ev();
extern void _ZN9S10103C40D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
extern void _ZN9S10103C403v69Ev();
extern void _ZN9S10103C403v70Ev();
static  VTBL_ENTRY vtc_S10103C40[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C40[0]),
  (VTBL_ENTRY)&_ZN9S10103C40D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C40D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10103C403v69Ev,
  (VTBL_ENTRY)&_ZN9S10103C403v70Ev,
};
extern VTBL_ENTRY _ZTI9S10103C40[];
extern  VTBL_ENTRY _ZTV9S10103C40[];
Class_Descriptor cd_S10103C40 = {  "S10103C40", // class name
  bases_S10103C40, 2,
  &(vtc_S10103C40[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10103C40),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C40),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C45  : S10103C41 {
  ::S10103C14_nt s10103c45f0;
  virtual void  v75(); // _ZN9S10103C453v75Ev
  virtual void  v76(); // _ZN9S10103C453v76Ev
  ~S10103C45(); // tgen
  S10103C45(); // tgen
};
//SIG(-1 S10103C45) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v3 v4 v5 v6 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1 v2 FC8}


void  S10103C45 ::v75(){vfunc_called(this, "_ZN9S10103C453v75Ev");}
void  S10103C45 ::v76(){vfunc_called(this, "_ZN9S10103C453v76Ev");}
S10103C45 ::~S10103C45(){ note_dtor("S10103C45", this);} // tgen
S10103C45 ::S10103C45(){ note_ctor("S10103C45", this);} // tgen

static void Test_S10103C45()
{
  extern Class_Descriptor cd_S10103C45;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S10103C45, buf);
    S10103C45 *dp, &lv = *(dp=new (buf) S10103C45());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S10103C45)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C45)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C41*), 0, "S10103C45");
    check_base_class_offset(lv, (S10103C41*), 0, "S10103C45");
    check_field_offset(lv, s10103c45f0, ABISELECT(136,92), "S10103C45.s10103c45f0");
    test_class_info(&lv, &cd_S10103C45);
    dp->~S10103C45();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C45(Test_S10103C45, "S10103C45", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN9S10103C45C1Ev();
extern void _ZN9S10103C45D1Ev();
Name_Map name_map_S10103C45[] = {
  NSPAIR(_ZN9S10103C45C1Ev),
  NSPAIR(_ZN9S10103C45D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C41;
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
static Base_Class bases_S10103C45[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C45[];
extern void _ZN9S10103C45D1Ev();
extern void _ZN9S10103C45D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
extern void _ZN9S10103C453v75Ev();
extern void _ZN9S10103C453v76Ev();
static  VTBL_ENTRY vtc_S10103C45[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C45[0]),
  (VTBL_ENTRY)&_ZN9S10103C45D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C45D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10103C453v75Ev,
  (VTBL_ENTRY)&_ZN9S10103C453v76Ev,
};
extern VTBL_ENTRY _ZTI9S10103C45[];
extern  VTBL_ENTRY _ZTV9S10103C45[];
Class_Descriptor cd_S10103C45 = {  "S10103C45", // class name
  bases_S10103C45, 2,
  &(vtc_S10103C45[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI9S10103C45),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C45),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C47  : S10103C41 {
  virtual void  v79(); // _ZN9S10103C473v79Ev
  ~S10103C47(); // tgen
  S10103C47(); // tgen
};
//SIG(-1 S10103C47) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v2 v3 v4 v5 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1}


void  S10103C47 ::v79(){vfunc_called(this, "_ZN9S10103C473v79Ev");}
S10103C47 ::~S10103C47(){ note_dtor("S10103C47", this);} // tgen
S10103C47 ::S10103C47(){ note_ctor("S10103C47", this);} // tgen

static void Test_S10103C47()
{
  extern Class_Descriptor cd_S10103C47;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10103C47, buf);
    S10103C47 *dp, &lv = *(dp=new (buf) S10103C47());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10103C47)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C47)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C41*), 0, "S10103C47");
    check_base_class_offset(lv, (S10103C41*), 0, "S10103C47");
    test_class_info(&lv, &cd_S10103C47);
    dp->~S10103C47();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C47(Test_S10103C47, "S10103C47", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10103C47C1Ev();
extern void _ZN9S10103C47D1Ev();
Name_Map name_map_S10103C47[] = {
  NSPAIR(_ZN9S10103C47C1Ev),
  NSPAIR(_ZN9S10103C47D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C41;
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
static Base_Class bases_S10103C47[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C47[];
extern void _ZN9S10103C47D1Ev();
extern void _ZN9S10103C47D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
extern void _ZN9S10103C473v79Ev();
static  VTBL_ENTRY vtc_S10103C47[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C47[0]),
  (VTBL_ENTRY)&_ZN9S10103C47D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C47D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10103C473v79Ev,
};
extern VTBL_ENTRY _ZTI9S10103C47[];
extern  VTBL_ENTRY _ZTV9S10103C47[];
Class_Descriptor cd_S10103C47 = {  "S10103C47", // class name
  bases_S10103C47, 2,
  &(vtc_S10103C47[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10103C47),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C47),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C49  : S10103C41 {
  virtual void  v81(); // _ZN9S10103C493v81Ev
  virtual void  v82(); // _ZN9S10103C493v82Ev
  ~S10103C49(); // tgen
  S10103C49(); // tgen
};
//SIG(-1 S10103C49) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v3 v4 v5 v6 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1 v2}


void  S10103C49 ::v81(){vfunc_called(this, "_ZN9S10103C493v81Ev");}
void  S10103C49 ::v82(){vfunc_called(this, "_ZN9S10103C493v82Ev");}
S10103C49 ::~S10103C49(){ note_dtor("S10103C49", this);} // tgen
S10103C49 ::S10103C49(){ note_ctor("S10103C49", this);} // tgen

static void Test_S10103C49()
{
  extern Class_Descriptor cd_S10103C49;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10103C49, buf);
    S10103C49 *dp, &lv = *(dp=new (buf) S10103C49());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10103C49)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C49)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C41*), 0, "S10103C49");
    check_base_class_offset(lv, (S10103C41*), 0, "S10103C49");
    test_class_info(&lv, &cd_S10103C49);
    dp->~S10103C49();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C49(Test_S10103C49, "S10103C49", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10103C49C1Ev();
extern void _ZN9S10103C49D1Ev();
Name_Map name_map_S10103C49[] = {
  NSPAIR(_ZN9S10103C49C1Ev),
  NSPAIR(_ZN9S10103C49D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C41;
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
static Base_Class bases_S10103C49[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C49[];
extern void _ZN9S10103C49D1Ev();
extern void _ZN9S10103C49D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
extern void _ZN9S10103C493v81Ev();
extern void _ZN9S10103C493v82Ev();
static  VTBL_ENTRY vtc_S10103C49[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C49[0]),
  (VTBL_ENTRY)&_ZN9S10103C49D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C49D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10103C493v81Ev,
  (VTBL_ENTRY)&_ZN9S10103C493v82Ev,
};
extern VTBL_ENTRY _ZTI9S10103C49[];
extern  VTBL_ENTRY _ZTV9S10103C49[];
Class_Descriptor cd_S10103C49 = {  "S10103C49", // class name
  bases_S10103C49, 2,
  &(vtc_S10103C49[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10103C49),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C49),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C50  : S10103C5_nt {
  virtual  ~S10103C50(); // _ZN9S10103C50D1Ev
  S10103C50(); // tgen
};
//SIG(-1 S10103C50) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd}


 S10103C50 ::~S10103C50(){ note_dtor("S10103C50", this);}
S10103C50 ::S10103C50(){ note_ctor("S10103C50", this);} // tgen

static void Test_S10103C50()
{
  extern Class_Descriptor cd_S10103C50;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_S10103C50, buf);
    S10103C50 *dp, &lv = *(dp=new (buf) S10103C50());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(S10103C50)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C50)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C50");
    test_class_info(&lv, &cd_S10103C50);
    dp->~S10103C50();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C50(Test_S10103C50, "S10103C50", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN9S10103C50C1Ev();
extern void _ZN9S10103C50D1Ev();
Name_Map name_map_S10103C50[] = {
  NSPAIR(_ZN9S10103C50C1Ev),
  NSPAIR(_ZN9S10103C50D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10103C50[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C50[];
extern void _ZN9S10103C50D1Ev();
extern void _ZN9S10103C50D0Ev();
static  VTBL_ENTRY vtc_S10103C50[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C50[0]),
  (VTBL_ENTRY)&_ZN9S10103C50D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C50D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C50[];
extern  VTBL_ENTRY _ZTV9S10103C50[];
Class_Descriptor cd_S10103C50 = {  "S10103C50", // class name
  bases_S10103C50, 1,
  &(vtc_S10103C50[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI9S10103C50),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C50),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C51  : S10103C5_nt {
  void *s10103c51f0[4];
  virtual  ~S10103C51(); // _ZN9S10103C51D1Ev
  S10103C51(); // tgen
};
//SIG(-1 S10103C51) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd Fp[4]}


 S10103C51 ::~S10103C51(){ note_dtor("S10103C51", this);}
S10103C51 ::S10103C51(){ note_ctor("S10103C51", this);} // tgen

static void Test_S10103C51()
{
  extern Class_Descriptor cd_S10103C51;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_S10103C51, buf);
    S10103C51 *dp, &lv = *(dp=new (buf) S10103C51());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(S10103C51)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C51)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C51");
    check_field_offset(lv, s10103c51f0, ABISELECT(48,32), "S10103C51.s10103c51f0");
    test_class_info(&lv, &cd_S10103C51);
    dp->~S10103C51();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C51(Test_S10103C51, "S10103C51", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN9S10103C51C1Ev();
extern void _ZN9S10103C51D1Ev();
Name_Map name_map_S10103C51[] = {
  NSPAIR(_ZN9S10103C51C1Ev),
  NSPAIR(_ZN9S10103C51D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10103C51[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C51[];
extern void _ZN9S10103C51D1Ev();
extern void _ZN9S10103C51D0Ev();
static  VTBL_ENTRY vtc_S10103C51[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C51[0]),
  (VTBL_ENTRY)&_ZN9S10103C51D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C51D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C51[];
extern  VTBL_ENTRY _ZTV9S10103C51[];
Class_Descriptor cd_S10103C51 = {  "S10103C51", // class name
  bases_S10103C51, 1,
  &(vtc_S10103C51[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI9S10103C51),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C51),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C52  : S10103C5_nt {
  void *s10103c52f0[2];
  int s10103c52f1[2];
  virtual  ~S10103C52(); // _ZN9S10103C52D1Ev
  virtual void  v83(); // _ZN9S10103C523v83Ev
  virtual void  v84(); // _ZN9S10103C523v84Ev
  S10103C52(); // tgen
};
//SIG(-1 S10103C52) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd v1 v2 Fp[2] Fi[2]}


 S10103C52 ::~S10103C52(){ note_dtor("S10103C52", this);}
void  S10103C52 ::v83(){vfunc_called(this, "_ZN9S10103C523v83Ev");}
void  S10103C52 ::v84(){vfunc_called(this, "_ZN9S10103C523v84Ev");}
S10103C52 ::S10103C52(){ note_ctor("S10103C52", this);} // tgen

static void Test_S10103C52()
{
  extern Class_Descriptor cd_S10103C52;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,13)];
    init_test(&cd_S10103C52, buf);
    S10103C52 *dp, &lv = *(dp=new (buf) S10103C52());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,48), "sizeof(S10103C52)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C52)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C52");
    check_field_offset(lv, s10103c52f0, ABISELECT(48,32), "S10103C52.s10103c52f0");
    check_field_offset(lv, s10103c52f1, ABISELECT(64,40), "S10103C52.s10103c52f1");
    test_class_info(&lv, &cd_S10103C52);
    dp->~S10103C52();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C52(Test_S10103C52, "S10103C52", ABISELECT(72,48));

#else // __cplusplus

extern void _ZN9S10103C52C1Ev();
extern void _ZN9S10103C52D1Ev();
Name_Map name_map_S10103C52[] = {
  NSPAIR(_ZN9S10103C52C1Ev),
  NSPAIR(_ZN9S10103C52D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10103C52[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C52[];
extern void _ZN9S10103C52D1Ev();
extern void _ZN9S10103C52D0Ev();
extern void _ZN9S10103C523v83Ev();
extern void _ZN9S10103C523v84Ev();
static  VTBL_ENTRY vtc_S10103C52[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C52[0]),
  (VTBL_ENTRY)&_ZN9S10103C52D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C52D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C523v83Ev,
  (VTBL_ENTRY)&_ZN9S10103C523v84Ev,
};
extern VTBL_ENTRY _ZTI9S10103C52[];
extern  VTBL_ENTRY _ZTV9S10103C52[];
Class_Descriptor cd_S10103C52 = {  "S10103C52", // class name
  bases_S10103C52, 1,
  &(vtc_S10103C52[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,48), // object size
  NSPAIRA(_ZTI9S10103C52),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C52),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C54_nt  {
  void *s10103c54f0;
  void  mf10103c54(); // _ZN12S10103C54_nt10mf10103c54Ev
};
//SIG(-1 S10103C54_nt) C1{ m Fp}


void  S10103C54_nt ::mf10103c54(){}

//skip512 S10103C54_nt

#else // __cplusplus

Class_Descriptor cd_S10103C54_nt = {  "S10103C54_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(8,4), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C53  {
  void *s10103c53f0;
  ::S10103C54_nt s10103c53f1;
  void *s10103c53f2;
  int s10103c53f3;
  void *s10103c53f4;
  void  mf10103c53(); // _ZN9S10103C5310mf10103c53Ev
  virtual  ~S10103C53(); // _ZN9S10103C53D1Ev
  S10103C53(); // tgen
};
//SIG(-1 S10103C53) C1{ vd m Fp FC2{ m Fp} Fp Fi Fp}


void  S10103C53 ::mf10103c53(){}
 S10103C53 ::~S10103C53(){ note_dtor("S10103C53", this);}
S10103C53 ::S10103C53(){ note_ctor("S10103C53", this);} // tgen

static void Test_S10103C53()
{
  extern Class_Descriptor cd_S10103C53;
  void *lvp;
  {
    ABISELECT(double,int) buf[7];
    init_test(&cd_S10103C53, buf);
    S10103C53 *dp, &lv = *(dp=new (buf) S10103C53());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(S10103C53)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C53)");
    check_field_offset(lv, s10103c53f0, ABISELECT(8,4), "S10103C53.s10103c53f0");
    check_field_offset(lv, s10103c53f1, ABISELECT(16,8), "S10103C53.s10103c53f1");
    check_field_offset(lv, s10103c53f2, ABISELECT(24,12), "S10103C53.s10103c53f2");
    check_field_offset(lv, s10103c53f3, ABISELECT(32,16), "S10103C53.s10103c53f3");
    check_field_offset(lv, s10103c53f4, ABISELECT(40,20), "S10103C53.s10103c53f4");
    test_class_info(&lv, &cd_S10103C53);
    dp->~S10103C53();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C53(Test_S10103C53, "S10103C53", ABISELECT(48,24));

#else // __cplusplus

extern void _ZN9S10103C53C1Ev();
extern void _ZN9S10103C53D1Ev();
Name_Map name_map_S10103C53[] = {
  NSPAIR(_ZN9S10103C53C1Ev),
  NSPAIR(_ZN9S10103C53D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10103C53[];
extern void _ZN9S10103C53D1Ev();
extern void _ZN9S10103C53D0Ev();
static  VTBL_ENTRY vtc_S10103C53[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C53[0]),
  (VTBL_ENTRY)&_ZN9S10103C53D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C53D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C53[];
extern  VTBL_ENTRY _ZTV9S10103C53[];
Class_Descriptor cd_S10103C53 = {  "S10103C53", // class name
  0,0,//no base classes
  &(vtc_S10103C53[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,24), // object size
  NSPAIRA(_ZTI9S10103C53),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10103C53),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C56  : S10103C41 {
  virtual void  v90(); // _ZN9S10103C563v90Ev
  ~S10103C56(); // tgen
  S10103C56(); // tgen
};
//SIG(-1 S10103C56) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v2 v3 v4 v5 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1}


void  S10103C56 ::v90(){vfunc_called(this, "_ZN9S10103C563v90Ev");}
S10103C56 ::~S10103C56(){ note_dtor("S10103C56", this);} // tgen
S10103C56 ::S10103C56(){ note_ctor("S10103C56", this);} // tgen

static void Test_S10103C56()
{
  extern Class_Descriptor cd_S10103C56;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10103C56, buf);
    S10103C56 *dp, &lv = *(dp=new (buf) S10103C56());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10103C56)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C56)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C41*), 0, "S10103C56");
    check_base_class_offset(lv, (S10103C41*), 0, "S10103C56");
    test_class_info(&lv, &cd_S10103C56);
    dp->~S10103C56();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C56(Test_S10103C56, "S10103C56", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10103C56C1Ev();
extern void _ZN9S10103C56D1Ev();
Name_Map name_map_S10103C56[] = {
  NSPAIR(_ZN9S10103C56C1Ev),
  NSPAIR(_ZN9S10103C56D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C41;
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
static Base_Class bases_S10103C56[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C56[];
extern void _ZN9S10103C56D1Ev();
extern void _ZN9S10103C56D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
extern void _ZN9S10103C563v90Ev();
static  VTBL_ENTRY vtc_S10103C56[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C56[0]),
  (VTBL_ENTRY)&_ZN9S10103C56D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C56D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10103C563v90Ev,
};
extern VTBL_ENTRY _ZTI9S10103C56[];
extern  VTBL_ENTRY _ZTV9S10103C56[];
Class_Descriptor cd_S10103C56 = {  "S10103C56", // class name
  bases_S10103C56, 2,
  &(vtc_S10103C56[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10103C56),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C56),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C57  : S10103C41 {
  void *s10103c57f0;
  virtual void  v91(); // _ZN9S10103C573v91Ev
  virtual void  v92(); // _ZN9S10103C573v92Ev
  virtual void  v93(); // _ZN9S10103C573v93Ev
  ~S10103C57(); // tgen
  S10103C57(); // tgen
};
//SIG(-1 S10103C57) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v4 v5 v6 v7 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1 v2 v3 Fp}


void  S10103C57 ::v91(){vfunc_called(this, "_ZN9S10103C573v91Ev");}
void  S10103C57 ::v92(){vfunc_called(this, "_ZN9S10103C573v92Ev");}
void  S10103C57 ::v93(){vfunc_called(this, "_ZN9S10103C573v93Ev");}
S10103C57 ::~S10103C57(){ note_dtor("S10103C57", this);} // tgen
S10103C57 ::S10103C57(){ note_ctor("S10103C57", this);} // tgen

static void Test_S10103C57()
{
  extern Class_Descriptor cd_S10103C57;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(19,25)];
    init_test(&cd_S10103C57, buf);
    S10103C57 *dp, &lv = *(dp=new (buf) S10103C57());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(144,96), "sizeof(S10103C57)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C57)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C41*), 0, "S10103C57");
    check_base_class_offset(lv, (S10103C41*), 0, "S10103C57");
    check_field_offset(lv, s10103c57f0, ABISELECT(136,92), "S10103C57.s10103c57f0");
    test_class_info(&lv, &cd_S10103C57);
    dp->~S10103C57();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C57(Test_S10103C57, "S10103C57", ABISELECT(144,96));

#else // __cplusplus

extern void _ZN9S10103C57C1Ev();
extern void _ZN9S10103C57D1Ev();
Name_Map name_map_S10103C57[] = {
  NSPAIR(_ZN9S10103C57C1Ev),
  NSPAIR(_ZN9S10103C57D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C41;
extern VTBL_ENTRY _ZTI9S10103C41[];
extern  VTBL_ENTRY _ZTV9S10103C41[];
static Base_Class bases_S10103C57[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C57[];
extern void _ZN9S10103C57D1Ev();
extern void _ZN9S10103C57D0Ev();
extern void _ZN9S10103C413v71Ev();
extern void _ZN9S10103C413v72Ev();
extern void _ZN9S10103C413v73Ev();
extern void _ZN9S10103C413v74Ev();
extern void _ZN9S10103C573v91Ev();
extern void _ZN9S10103C573v92Ev();
extern void _ZN9S10103C573v93Ev();
static  VTBL_ENTRY vtc_S10103C57[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C57[0]),
  (VTBL_ENTRY)&_ZN9S10103C57D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C57D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10103C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10103C573v91Ev,
  (VTBL_ENTRY)&_ZN9S10103C573v92Ev,
  (VTBL_ENTRY)&_ZN9S10103C573v93Ev,
};
extern VTBL_ENTRY _ZTI9S10103C57[];
extern  VTBL_ENTRY _ZTV9S10103C57[];
Class_Descriptor cd_S10103C57 = {  "S10103C57", // class name
  bases_S10103C57, 2,
  &(vtc_S10103C57[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(144,96), // object size
  NSPAIRA(_ZTI9S10103C57),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C57),11, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C58_nt  {
  ::S10103C20_nt s10103c58f0;
  void *s10103c58f1[2];
  void  mf10103c58(); // _ZN12S10103C58_nt10mf10103c58Ev
};
//SIG(-1 S10103C58_nt) C1{ m FC2{ m Fp Fi[2] FC3{ m}} Fp[2]}


void  S10103C58_nt ::mf10103c58(){}

//skip512 S10103C58_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C55  : S10103C2_nt , S10103C3_nt {
  ::S10103C56 s10103c55f0;
  ::S10103C56 s10103c55f1;
  ::S10103C56 s10103c55f2;
  ::S10103C47 s10103c55f3;
  ::S10103C57 s10103c55f4;
  ::S10103C40 s10103c55f5;
  void *s10103c55f6[2];
  ::S10103C58_nt s10103c55f7;
  virtual  ~S10103C55(); // _ZN9S10103C55D1Ev
  virtual void  v85(); // _ZN9S10103C553v85Ev
  virtual void  v86(); // _ZN9S10103C553v86Ev
  virtual void  v87(); // _ZN9S10103C553v87Ev
  virtual void  v88(); // _ZN9S10103C553v88Ev
  virtual void  v89(); // _ZN9S10103C553v89Ev
  S10103C55(); // tgen
};
//SIG(-1 S10103C55) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 FC4{ BC5{ BC6{ vd m FC7{ m Fp Fi FC8{ m} FC8} FC7 Fc} vd v13 v14 v15 v16 FC9{ m Fp FC10{ m FC11{ m Fp Fi FC12{ m}} Fi} FC11 FC11 Fi} Fp Fc Fi} v12} FC4 FC4 FC13{ BC5 v17} FC14{ BC5 v18 v19 v20 Fp} FC15{ BC5 v21 v22} Fp[2] FC16{ m FC17{ m Fp Fi[2] FC12} Fp[2]}}


 S10103C55 ::~S10103C55(){ note_dtor("S10103C55", this);}
void  S10103C55 ::v85(){vfunc_called(this, "_ZN9S10103C553v85Ev");}
void  S10103C55 ::v86(){vfunc_called(this, "_ZN9S10103C553v86Ev");}
void  S10103C55 ::v87(){vfunc_called(this, "_ZN9S10103C553v87Ev");}
void  S10103C55 ::v88(){vfunc_called(this, "_ZN9S10103C553v88Ev");}
void  S10103C55 ::v89(){vfunc_called(this, "_ZN9S10103C553v89Ev");}
S10103C55 ::S10103C55(){ note_ctor("S10103C55", this);} // tgen

static void Test_S10103C55()
{
  extern Class_Descriptor cd_S10103C55;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(114,151)];
    init_test(&cd_S10103C55, buf);
    S10103C55 *dp, &lv = *(dp=new (buf) S10103C55());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(904,600), "sizeof(S10103C55)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C55)");
    check_base_class_offset(lv, (S10103C2_nt*), 0, "S10103C55");
    check_base_class_offset(lv, (S10103C3_nt*), ABISELECT(8,4), "S10103C55");
    check_field_offset(lv, s10103c55f0, ABISELECT(24,12), "S10103C55.s10103c55f0");
    check_field_offset(lv, s10103c55f1, ABISELECT(160,104), "S10103C55.s10103c55f1");
    check_field_offset(lv, s10103c55f2, ABISELECT(296,196), "S10103C55.s10103c55f2");
    check_field_offset(lv, s10103c55f3, ABISELECT(432,288), "S10103C55.s10103c55f3");
    check_field_offset(lv, s10103c55f4, ABISELECT(568,380), "S10103C55.s10103c55f4");
    check_field_offset(lv, s10103c55f5, ABISELECT(712,476), "S10103C55.s10103c55f5");
    check_field_offset(lv, s10103c55f6, ABISELECT(848,568), "S10103C55.s10103c55f6");
    check_field_offset(lv, s10103c55f7, ABISELECT(864,576), "S10103C55.s10103c55f7");
    test_class_info(&lv, &cd_S10103C55);
    dp->~S10103C55();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C55(Test_S10103C55, "S10103C55", ABISELECT(904,600));

#else // __cplusplus

extern void _ZN9S10103C55C1Ev();
extern void _ZN9S10103C55D1Ev();
Name_Map name_map_S10103C55[] = {
  NSPAIR(_ZN9S10103C55C1Ev),
  NSPAIR(_ZN9S10103C55D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C2_nt;
extern VTBL_ENTRY _ZTI11S10103C2_nt[];
extern  VTBL_ENTRY _ZTV11S10103C2_nt[];
extern Class_Descriptor cd_S10103C3_nt;
extern VTBL_ENTRY _ZTI11S10103C3_nt[];
extern  VTBL_ENTRY _ZTV11S10103C3_nt[];
static Base_Class bases_S10103C55[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C3_nt,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C55[];
extern void _ZN9S10103C55D1Ev();
extern void _ZN9S10103C55D0Ev();
extern void _ZN11S10103C2_nt2v6Ev();
extern void _ZN9S10103C553v85Ev();
extern void _ZN9S10103C553v86Ev();
extern void _ZN9S10103C553v87Ev();
extern void _ZN9S10103C553v88Ev();
extern void _ZN9S10103C553v89Ev();
extern void ABISELECT(_ZThn8_N9S10103C55D1Ev,_ZThn4_N9S10103C55D1Ev)();
extern void ABISELECT(_ZThn8_N9S10103C55D0Ev,_ZThn4_N9S10103C55D0Ev)();
extern void _ZN11S10103C3_nt2v7Ev();
extern void _ZN11S10103C3_nt2v8Ev();
extern void _ZN11S10103C3_nt2v9Ev();
extern void _ZN11S10103C3_nt3v10Ev();
extern void _ZN11S10103C3_nt3v11Ev();
static  VTBL_ENTRY vtc_S10103C55[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C55[0]),
  (VTBL_ENTRY)&_ZN9S10103C55D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C55D0Ev,
  (VTBL_ENTRY)&_ZN11S10103C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN9S10103C553v85Ev,
  (VTBL_ENTRY)&_ZN9S10103C553v86Ev,
  (VTBL_ENTRY)&_ZN9S10103C553v87Ev,
  (VTBL_ENTRY)&_ZN9S10103C553v88Ev,
  (VTBL_ENTRY)&_ZN9S10103C553v89Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI9S10103C55[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N9S10103C55D1Ev,_ZThn4_N9S10103C55D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N9S10103C55D0Ev,_ZThn4_N9S10103C55D0Ev),
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v7Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v8Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v9Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v10Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v11Ev,
};
extern VTBL_ENTRY _ZTI9S10103C55[];
extern  VTBL_ENTRY _ZTV9S10103C55[];
Class_Descriptor cd_S10103C55 = {  "S10103C55", // class name
  bases_S10103C55, 2,
  &(vtc_S10103C55[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(904,600), // object size
  NSPAIRA(_ZTI9S10103C55),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C55),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C64  {
  void *s10103c64f0;
  void  mf10103c64(); // _ZN9S10103C6410mf10103c64Ev
};
//SIG(-1 S10103C64) C1{ m Fp}


void  S10103C64 ::mf10103c64(){}

static void Test_S10103C64()
{
  {
    init_simple_test("S10103C64");
    S10103C64 lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10103C64)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C64)");
    check_field_offset(lv, s10103c64f0, 0, "S10103C64.s10103c64f0");
  }
}
static Arrange_To_Call_Me vS10103C64(Test_S10103C64, "S10103C64", ABISELECT(8,4));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C67_nt  {
  virtual  ~S10103C67_nt(); // _ZN12S10103C67_ntD1Ev
  virtual void  v112(); // _ZN12S10103C67_nt4v112Ev
  virtual void  v113(); // _ZN12S10103C67_nt4v113Ev
  S10103C67_nt(); // tgen
};
//SIG(-1 S10103C67_nt) C1{ vd v1 v2}


 S10103C67_nt ::~S10103C67_nt(){ note_dtor("S10103C67_nt", this);}
void  S10103C67_nt ::v112(){vfunc_called(this, "_ZN12S10103C67_nt4v112Ev");}
void  S10103C67_nt ::v113(){vfunc_called(this, "_ZN12S10103C67_nt4v113Ev");}
S10103C67_nt ::S10103C67_nt(){ note_ctor("S10103C67_nt", this);} // tgen

//skip512 S10103C67_nt

#else // __cplusplus

extern void _ZN12S10103C67_ntC1Ev();
extern void _ZN12S10103C67_ntD1Ev();
Name_Map name_map_S10103C67_nt[] = {
  NSPAIR(_ZN12S10103C67_ntC1Ev),
  NSPAIR(_ZN12S10103C67_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI12S10103C67_nt[];
extern void _ZN12S10103C67_ntD1Ev();
extern void _ZN12S10103C67_ntD0Ev();
extern void _ZN12S10103C67_nt4v112Ev();
extern void _ZN12S10103C67_nt4v113Ev();
static  VTBL_ENTRY vtc_S10103C67_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI12S10103C67_nt[0]),
  (VTBL_ENTRY)&_ZN12S10103C67_ntD1Ev,
  (VTBL_ENTRY)&_ZN12S10103C67_ntD0Ev,
  (VTBL_ENTRY)&_ZN12S10103C67_nt4v112Ev,
  (VTBL_ENTRY)&_ZN12S10103C67_nt4v113Ev,
};
extern VTBL_ENTRY _ZTI12S10103C67_nt[];
VTBL_ENTRY *P__ZTI12S10103C67_nt = _ZTI12S10103C67_nt; 
extern  VTBL_ENTRY _ZTV12S10103C67_nt[];
Class_Descriptor cd_S10103C67_nt = {  "S10103C67_nt", // class name
  0,0,//no base classes
  &(vtc_S10103C67_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI12S10103C67_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV12S10103C67_nt),6, //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

struct  S10103C66  : S10103C67_nt {
  ::S10103C14_nt s10103c66f0;
  int s10103c66f1;
  __tsi64 s10103c66f2[2];
  int s10103c66f3;
  ~S10103C66(); // tgen
  S10103C66(); // tgen
};
//SIG(-1 S10103C66) C1{ BC2{ vd v1 v2} FC3{ m Fp Fi FC4{ m}} Fi FL[2] Fi}


S10103C66 ::~S10103C66(){ note_dtor("S10103C66", this);} // tgen
S10103C66 ::S10103C66(){ note_ctor("S10103C66", this);} // tgen

static void Test_S10103C66()
{
  extern Class_Descriptor cd_S10103C66;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_S10103C66, buf);
    S10103C66 *dp, &lv = *(dp=new (buf) S10103C66());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(S10103C66)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C66)");
    check_base_class_offset(lv, (S10103C67_nt*), 0, "S10103C66");
    check_field_offset(lv, s10103c66f0, ABISELECT(8,4), "S10103C66.s10103c66f0");
    check_field_offset(lv, s10103c66f1, ABISELECT(24,16), "S10103C66.s10103c66f1");
    check_field_offset(lv, s10103c66f2, ABISELECT(32,20), "S10103C66.s10103c66f2");
    check_field_offset(lv, s10103c66f3, ABISELECT(48,36), "S10103C66.s10103c66f3");
    test_class_info(&lv, &cd_S10103C66);
    dp->~S10103C66();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C66(Test_S10103C66, "S10103C66", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN9S10103C66C1Ev();
extern void _ZN9S10103C66D1Ev();
Name_Map name_map_S10103C66[] = {
  NSPAIR(_ZN9S10103C66C1Ev),
  NSPAIR(_ZN9S10103C66D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C67_nt;
extern VTBL_ENTRY _ZTI12S10103C67_nt[];
extern  VTBL_ENTRY _ZTV12S10103C67_nt[];
static Base_Class bases_S10103C66[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C67_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C66[];
extern void _ZN9S10103C66D1Ev();
extern void _ZN9S10103C66D0Ev();
extern void _ZN12S10103C67_nt4v112Ev();
extern void _ZN12S10103C67_nt4v113Ev();
static  VTBL_ENTRY vtc_S10103C66[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C66[0]),
  (VTBL_ENTRY)&_ZN9S10103C66D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C66D0Ev,
  (VTBL_ENTRY)&_ZN12S10103C67_nt4v112Ev,
  (VTBL_ENTRY)&_ZN12S10103C67_nt4v113Ev,
};
extern VTBL_ENTRY _ZTI9S10103C66[];
extern  VTBL_ENTRY _ZTV9S10103C66[];
Class_Descriptor cd_S10103C66 = {  "S10103C66", // class name
  bases_S10103C66, 1,
  &(vtc_S10103C66[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI9S10103C66),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C66),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C71  {
  void  mf10103c71(); // _ZN9S10103C7110mf10103c71Ev
};
//SIG(-1 S10103C71) C1{ m}


void  S10103C71 ::mf10103c71(){}

static void Test_S10103C71()
{
  {
    init_simple_test("S10103C71");
    S10103C71 lv;
    check2(sizeof(lv), 1, "sizeof(S10103C71)");
    check2(__alignof__(lv), 1, "__alignof__(S10103C71)");
  }
}
static Arrange_To_Call_Me vS10103C71(Test_S10103C71, "S10103C71", 1);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C70  {
  void *s10103c70f0;
  int s10103c70f1[2];
  ::S10103C71 s10103c70f2;
  void  mf10103c70(); // _ZN9S10103C7010mf10103c70Ev
};
//SIG(-1 S10103C70) C1{ m Fp Fi[2] FC2{ m}}


void  S10103C70 ::mf10103c70(){}

static void Test_S10103C70()
{
  {
    init_simple_test("S10103C70");
    S10103C70 lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S10103C70)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C70)");
    check_field_offset(lv, s10103c70f0, 0, "S10103C70.s10103c70f0");
    check_field_offset(lv, s10103c70f1, ABISELECT(8,4), "S10103C70.s10103c70f1");
    check_field_offset(lv, s10103c70f2, ABISELECT(16,12), "S10103C70.s10103c70f2");
  }
}
static Arrange_To_Call_Me vS10103C70(Test_S10103C70, "S10103C70", ABISELECT(24,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C72_nt  {
  int s10103c72f0[4];
  void  mf10103c72(); // _ZN12S10103C72_nt10mf10103c72Ev
};
//SIG(1 S10103C72_nt) C1{ m Fi[4]}


void  S10103C72_nt ::mf10103c72(){}

//skip512 S10103C72_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C69_nt  {
  ::S10103C70 s10103c69f0;
  ::S10103C72_nt s10103c69f1[3];
  void *s10103c69f2[2];
  int s10103c69f3;
  char s10103c69f4;
  virtual  ~S10103C69_nt(); // _ZN12S10103C69_ntD1Ev
  virtual void  v114(); // _ZN12S10103C69_nt4v114Ev
  virtual void  v115(); // _ZN12S10103C69_nt4v115Ev
  S10103C69_nt(); // tgen
};
//SIG(-1 S10103C69_nt) C1{ vd v1 v2 FC2{ m Fp Fi[2] FC3{ m}} FC4{ m Fi[4]}[3] Fp[2] Fi Fc}


 S10103C69_nt ::~S10103C69_nt(){ note_dtor("S10103C69_nt", this);}
void  S10103C69_nt ::v114(){vfunc_called(this, "_ZN12S10103C69_nt4v114Ev");}
void  S10103C69_nt ::v115(){vfunc_called(this, "_ZN12S10103C69_nt4v115Ev");}
S10103C69_nt ::S10103C69_nt(){ note_ctor("S10103C69_nt", this);} // tgen

//skip512 S10103C69_nt

#else // __cplusplus

extern void _ZN12S10103C69_ntC1Ev();
extern void _ZN12S10103C69_ntD1Ev();
Name_Map name_map_S10103C69_nt[] = {
  NSPAIR(_ZN12S10103C69_ntC1Ev),
  NSPAIR(_ZN12S10103C69_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI12S10103C69_nt[];
extern void _ZN12S10103C69_ntD1Ev();
extern void _ZN12S10103C69_ntD0Ev();
extern void _ZN12S10103C69_nt4v114Ev();
extern void _ZN12S10103C69_nt4v115Ev();
static  VTBL_ENTRY vtc_S10103C69_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI12S10103C69_nt[0]),
  (VTBL_ENTRY)&_ZN12S10103C69_ntD1Ev,
  (VTBL_ENTRY)&_ZN12S10103C69_ntD0Ev,
  (VTBL_ENTRY)&_ZN12S10103C69_nt4v114Ev,
  (VTBL_ENTRY)&_ZN12S10103C69_nt4v115Ev,
};
extern VTBL_ENTRY _ZTI12S10103C69_nt[];
VTBL_ENTRY *P__ZTI12S10103C69_nt = _ZTI12S10103C69_nt; 
extern  VTBL_ENTRY _ZTV12S10103C69_nt[];
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C68  {
  void *s10103c68f0[2];
  ::S10103C69_nt s10103c68f1;
  void *s10103c68f2[2];
  void  mf10103c68(); // _ZN9S10103C6810mf10103c68Ev
};
//SIG(-1 S10103C68) C1{ m Fp[2] FC2{ vd v1 v2 FC3{ m Fp Fi[2] FC4{ m}} FC5{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]}


void  S10103C68 ::mf10103c68(){}

static void Test_S10103C68()
{
  {
    init_simple_test("S10103C68");
    S10103C68 lv;
    check2(sizeof(lv), ABISELECT(136,100), "sizeof(S10103C68)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C68)");
    check_field_offset(lv, s10103c68f0, 0, "S10103C68.s10103c68f0");
    check_field_offset(lv, s10103c68f1, ABISELECT(16,8), "S10103C68.s10103c68f1");
    check_field_offset(lv, s10103c68f2, ABISELECT(120,92), "S10103C68.s10103c68f2");
  }
}
static Arrange_To_Call_Me vS10103C68(Test_S10103C68, "S10103C68", ABISELECT(136,100));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C76  {
  void *s10103c76f0[2];
  ::S10103C13_nt s10103c76f1;
  void *s10103c76f2;
  virtual  ~S10103C76(); // _ZN9S10103C76D1Ev
  virtual void  v120(); // _ZN9S10103C764v120Ev
  virtual void  v121(); // _ZN9S10103C764v121Ev
  virtual void  v122(); // _ZN9S10103C764v122Ev
  virtual void  v123(); // _ZN9S10103C764v123Ev
  virtual void  v124(); // _ZN9S10103C764v124Ev
  virtual void  v125(); // _ZN9S10103C764v125Ev
  virtual void  v126(); // _ZN9S10103C764v126Ev
  virtual void  v127(); // _ZN9S10103C764v127Ev
  virtual void  v128(); // _ZN9S10103C764v128Ev
  virtual void  v129(); // _ZN9S10103C764v129Ev
  S10103C76(); // tgen
};
//SIG(-1 S10103C76) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S10103C76 ::~S10103C76(){ note_dtor("S10103C76", this);}
void  S10103C76 ::v120(){vfunc_called(this, "_ZN9S10103C764v120Ev");}
void  S10103C76 ::v121(){vfunc_called(this, "_ZN9S10103C764v121Ev");}
void  S10103C76 ::v122(){vfunc_called(this, "_ZN9S10103C764v122Ev");}
void  S10103C76 ::v123(){vfunc_called(this, "_ZN9S10103C764v123Ev");}
void  S10103C76 ::v124(){vfunc_called(this, "_ZN9S10103C764v124Ev");}
void  S10103C76 ::v125(){vfunc_called(this, "_ZN9S10103C764v125Ev");}
void  S10103C76 ::v126(){vfunc_called(this, "_ZN9S10103C764v126Ev");}
void  S10103C76 ::v127(){vfunc_called(this, "_ZN9S10103C764v127Ev");}
void  S10103C76 ::v128(){vfunc_called(this, "_ZN9S10103C764v128Ev");}
void  S10103C76 ::v129(){vfunc_called(this, "_ZN9S10103C764v129Ev");}
S10103C76 ::S10103C76(){ note_ctor("S10103C76", this);} // tgen

static void Test_S10103C76()
{
  extern Class_Descriptor cd_S10103C76;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S10103C76, buf);
    S10103C76 *dp, &lv = *(dp=new (buf) S10103C76());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S10103C76)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C76)");
    check_field_offset(lv, s10103c76f0, ABISELECT(8,4), "S10103C76.s10103c76f0");
    check_field_offset(lv, s10103c76f1, ABISELECT(24,12), "S10103C76.s10103c76f1");
    check_field_offset(lv, s10103c76f2, ABISELECT(48,28), "S10103C76.s10103c76f2");
    test_class_info(&lv, &cd_S10103C76);
    dp->~S10103C76();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C76(Test_S10103C76, "S10103C76", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN9S10103C76C1Ev();
extern void _ZN9S10103C76D1Ev();
Name_Map name_map_S10103C76[] = {
  NSPAIR(_ZN9S10103C76C1Ev),
  NSPAIR(_ZN9S10103C76D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10103C76[];
extern void _ZN9S10103C76D1Ev();
extern void _ZN9S10103C76D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
static  VTBL_ENTRY vtc_S10103C76[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C76[0]),
  (VTBL_ENTRY)&_ZN9S10103C76D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C76D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
};
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
Class_Descriptor cd_S10103C76 = {  "S10103C76", // class name
  0,0,//no base classes
  &(vtc_S10103C76[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI9S10103C76),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10103C76),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C83_nt  {
  __tsi64 s10103c83f0[2];
  void  mf10103c83(); // _ZN12S10103C83_nt10mf10103c83Ev
};
//SIG(-1 S10103C83_nt) C1{ m FL[2]}


void  S10103C83_nt ::mf10103c83(){}

//skip512 S10103C83_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C82_nt  {
  ::S10103C83_nt s10103c82f0;
  void  mf10103c82(); // _ZN12S10103C82_nt10mf10103c82Ev
};
//SIG(-1 S10103C82_nt) C1{ m FC2{ m FL[2]}}


void  S10103C82_nt ::mf10103c82(){}

//skip512 S10103C82_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C75  : S10103C76 {
  ::S10103C35 s10103c75f0;
  ::S10103C70 s10103c75f1;
  ::S10103C82_nt s10103c75f2;
  ::S10103C13_nt s10103c75f3;
  virtual  ~S10103C75(); // _ZN9S10103C75D1Ev
  virtual void  v130(); // _ZN9S10103C754v130Ev
  virtual void  v131(); // _ZN9S10103C754v131Ev
  virtual void  v132(); // _ZN9S10103C754v132Ev
  virtual void  v133(); // _ZN9S10103C754v133Ev
  virtual void  v134(); // _ZN9S10103C754v134Ev
  virtual void  v135(); // _ZN9S10103C754v135Ev
  virtual void  v136(); // _ZN9S10103C754v136Ev
  virtual void  v137(); // _ZN9S10103C754v137Ev
  virtual void  v138(); // _ZN9S10103C754v138Ev
  virtual void  v139(); // _ZN9S10103C754v139Ev
  virtual void  v140(); // _ZN9S10103C754v140Ev
  virtual void  v141(); // _ZN9S10103C754v141Ev
  virtual void  v142(); // _ZN9S10103C754v142Ev
  virtual void  v143(); // _ZN9S10103C754v143Ev
  S10103C75(); // tgen
};
//SIG(-1 S10103C75) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC7} FC8{ m Fp Fi[2] FC9{ m}} FC10{ m FC11{ m FL[2]}} FC3}


 S10103C75 ::~S10103C75(){ note_dtor("S10103C75", this);}
void  S10103C75 ::v130(){vfunc_called(this, "_ZN9S10103C754v130Ev");}
void  S10103C75 ::v131(){vfunc_called(this, "_ZN9S10103C754v131Ev");}
void  S10103C75 ::v132(){vfunc_called(this, "_ZN9S10103C754v132Ev");}
void  S10103C75 ::v133(){vfunc_called(this, "_ZN9S10103C754v133Ev");}
void  S10103C75 ::v134(){vfunc_called(this, "_ZN9S10103C754v134Ev");}
void  S10103C75 ::v135(){vfunc_called(this, "_ZN9S10103C754v135Ev");}
void  S10103C75 ::v136(){vfunc_called(this, "_ZN9S10103C754v136Ev");}
void  S10103C75 ::v137(){vfunc_called(this, "_ZN9S10103C754v137Ev");}
void  S10103C75 ::v138(){vfunc_called(this, "_ZN9S10103C754v138Ev");}
void  S10103C75 ::v139(){vfunc_called(this, "_ZN9S10103C754v139Ev");}
void  S10103C75 ::v140(){vfunc_called(this, "_ZN9S10103C754v140Ev");}
void  S10103C75 ::v141(){vfunc_called(this, "_ZN9S10103C754v141Ev");}
void  S10103C75 ::v142(){vfunc_called(this, "_ZN9S10103C754v142Ev");}
void  S10103C75 ::v143(){vfunc_called(this, "_ZN9S10103C754v143Ev");}
S10103C75 ::S10103C75(){ note_ctor("S10103C75", this);} // tgen

static void Test_S10103C75()
{
  extern Class_Descriptor cd_S10103C75;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10103C75, buf);
    S10103C75 *dp, &lv = *(dp=new (buf) S10103C75());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10103C75)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C75)");
    check_base_class_offset(lv, (S10103C76*), 0, "S10103C75");
    check_field_offset(lv, s10103c75f0, ABISELECT(56,32), "S10103C75.s10103c75f0");
    check_field_offset(lv, s10103c75f1, ABISELECT(72,44), "S10103C75.s10103c75f1");
    check_field_offset(lv, s10103c75f2, ABISELECT(96,60), "S10103C75.s10103c75f2");
    check_field_offset(lv, s10103c75f3, ABISELECT(112,76), "S10103C75.s10103c75f3");
    test_class_info(&lv, &cd_S10103C75);
    dp->~S10103C75();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C75(Test_S10103C75, "S10103C75", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10103C75C1Ev();
extern void _ZN9S10103C75D1Ev();
Name_Map name_map_S10103C75[] = {
  NSPAIR(_ZN9S10103C75C1Ev),
  NSPAIR(_ZN9S10103C75D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C76;
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
static Base_Class bases_S10103C75[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C76,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C75[];
extern void _ZN9S10103C75D1Ev();
extern void _ZN9S10103C75D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
extern void _ZN9S10103C754v130Ev();
extern void _ZN9S10103C754v131Ev();
extern void _ZN9S10103C754v132Ev();
extern void _ZN9S10103C754v133Ev();
extern void _ZN9S10103C754v134Ev();
extern void _ZN9S10103C754v135Ev();
extern void _ZN9S10103C754v136Ev();
extern void _ZN9S10103C754v137Ev();
extern void _ZN9S10103C754v138Ev();
extern void _ZN9S10103C754v139Ev();
extern void _ZN9S10103C754v140Ev();
extern void _ZN9S10103C754v141Ev();
extern void _ZN9S10103C754v142Ev();
extern void _ZN9S10103C754v143Ev();
static  VTBL_ENTRY vtc_S10103C75[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C75[0]),
  (VTBL_ENTRY)&_ZN9S10103C75D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C75D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v130Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v131Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v132Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v133Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v134Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v135Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v136Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v137Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v138Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v139Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v140Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v141Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v142Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v143Ev,
};
extern VTBL_ENTRY _ZTI9S10103C75[];
extern  VTBL_ENTRY _ZTV9S10103C75[];
Class_Descriptor cd_S10103C75 = {  "S10103C75", // class name
  bases_S10103C75, 1,
  &(vtc_S10103C75[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10103C75),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C75),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C88  {
  void  mf10103c88(); // _ZN9S10103C8810mf10103c88Ev
};
//SIG(-1 S10103C88) C1{ m}


void  S10103C88 ::mf10103c88(){}

static void Test_S10103C88()
{
  {
    init_simple_test("S10103C88");
    S10103C88 lv;
    check2(sizeof(lv), 1, "sizeof(S10103C88)");
    check2(__alignof__(lv), 1, "__alignof__(S10103C88)");
  }
}
static Arrange_To_Call_Me vS10103C88(Test_S10103C88, "S10103C88", 1);

#else // __cplusplus

extern VTBL_ENTRY _ZTI9S10103C88[];
VTBL_ENTRY *P__ZTI9S10103C88 = _ZTI9S10103C88; 
Class_Descriptor cd_S10103C88 = {  "S10103C88", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  1, // object size
  NSPAIRA(_ZTI9S10103C88),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C86  {
  void *s10103c86f0;
  int s10103c86f1;
  ::S10103C71 s10103c86f2;
  ::S10103C88 s10103c86f3;
  void  mf10103c86(); // _ZN9S10103C8610mf10103c86Ev
};
//SIG(-1 S10103C86) C1{ m Fp Fi FC2{ m} FC3{ m}}


void  S10103C86 ::mf10103c86(){}

static void Test_S10103C86()
{
  {
    init_simple_test("S10103C86");
    S10103C86 lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(S10103C86)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C86)");
    check_field_offset(lv, s10103c86f0, 0, "S10103C86.s10103c86f0");
    check_field_offset(lv, s10103c86f1, ABISELECT(8,4), "S10103C86.s10103c86f1");
    check_field_offset(lv, s10103c86f2, ABISELECT(12,8), "S10103C86.s10103c86f2");
    check_field_offset(lv, s10103c86f3, ABISELECT(13,9), "S10103C86.s10103c86f3");
  }
}
static Arrange_To_Call_Me vS10103C86(Test_S10103C86, "S10103C86", ABISELECT(16,12));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C85  : S10103C76 {
  void *s10103c85f0;
  int s10103c85f1;
  ::S10103C86 s10103c85f2;
  ::S10103C82_nt s10103c85f3;
  int s10103c85f4;
  virtual  ~S10103C85(); // _ZN9S10103C85D1Ev
  virtual void  v152(); // _ZN9S10103C854v152Ev
  virtual void  v153(); // _ZN9S10103C854v153Ev
  virtual void  v154(); // _ZN9S10103C854v154Ev
  virtual void  v155(); // _ZN9S10103C854v155Ev
  virtual void  v156(); // _ZN9S10103C854v156Ev
  virtual void  v157(); // _ZN9S10103C854v157Ev
  S10103C85(); // tgen
};
//SIG(-1 S10103C85) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp Fi FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m FC10{ m FL[2]}} Fi}


 S10103C85 ::~S10103C85(){ note_dtor("S10103C85", this);}
void  S10103C85 ::v152(){vfunc_called(this, "_ZN9S10103C854v152Ev");}
void  S10103C85 ::v153(){vfunc_called(this, "_ZN9S10103C854v153Ev");}
void  S10103C85 ::v154(){vfunc_called(this, "_ZN9S10103C854v154Ev");}
void  S10103C85 ::v155(){vfunc_called(this, "_ZN9S10103C854v155Ev");}
void  S10103C85 ::v156(){vfunc_called(this, "_ZN9S10103C854v156Ev");}
void  S10103C85 ::v157(){vfunc_called(this, "_ZN9S10103C854v157Ev");}
S10103C85 ::S10103C85(){ note_ctor("S10103C85", this);} // tgen

static void Test_S10103C85()
{
  extern Class_Descriptor cd_S10103C85;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,19)];
    init_test(&cd_S10103C85, buf);
    S10103C85 *dp, &lv = *(dp=new (buf) S10103C85());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,72), "sizeof(S10103C85)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C85)");
    check_base_class_offset(lv, (S10103C76*), 0, "S10103C85");
    check_field_offset(lv, s10103c85f0, ABISELECT(56,32), "S10103C85.s10103c85f0");
    check_field_offset(lv, s10103c85f1, ABISELECT(64,36), "S10103C85.s10103c85f1");
    check_field_offset(lv, s10103c85f2, ABISELECT(72,40), "S10103C85.s10103c85f2");
    check_field_offset(lv, s10103c85f3, ABISELECT(88,52), "S10103C85.s10103c85f3");
    check_field_offset(lv, s10103c85f4, ABISELECT(104,68), "S10103C85.s10103c85f4");
    test_class_info(&lv, &cd_S10103C85);
    dp->~S10103C85();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C85(Test_S10103C85, "S10103C85", ABISELECT(112,72));

#else // __cplusplus

extern void _ZN9S10103C85C1Ev();
extern void _ZN9S10103C85D1Ev();
Name_Map name_map_S10103C85[] = {
  NSPAIR(_ZN9S10103C85C1Ev),
  NSPAIR(_ZN9S10103C85D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C76;
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
static Base_Class bases_S10103C85[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C76,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C85[];
extern void _ZN9S10103C85D1Ev();
extern void _ZN9S10103C85D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
extern void _ZN9S10103C854v152Ev();
extern void _ZN9S10103C854v153Ev();
extern void _ZN9S10103C854v154Ev();
extern void _ZN9S10103C854v155Ev();
extern void _ZN9S10103C854v156Ev();
extern void _ZN9S10103C854v157Ev();
static  VTBL_ENTRY vtc_S10103C85[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C85[0]),
  (VTBL_ENTRY)&_ZN9S10103C85D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C85D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v152Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v153Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v154Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v155Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v156Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v157Ev,
};
extern VTBL_ENTRY _ZTI9S10103C85[];
extern  VTBL_ENTRY _ZTV9S10103C85[];
Class_Descriptor cd_S10103C85 = {  "S10103C85", // class name
  bases_S10103C85, 1,
  &(vtc_S10103C85[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(112,72), // object size
  NSPAIRA(_ZTI9S10103C85),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C85),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C84  : S10103C85 {
  ::S10103C13_nt s10103c84f0[4];
  ::S10103C82_nt s10103c84f1;
  ::S10103C82_nt s10103c84f2;
  ::S10103C82_nt s10103c84f3;
  ::S10103C82_nt s10103c84f4;
  int s10103c84f5[6];
  virtual  ~S10103C84(); // _ZN9S10103C84D1Ev
  virtual void  v148(); // _ZN9S10103C844v148Ev
  virtual void  v149(); // _ZN9S10103C844v149Ev
  virtual void  v150(); // _ZN9S10103C844v150Ev
  virtual void  v151(); // _ZN9S10103C844v151Ev
  S10103C84(); // tgen
};
//SIG(-1 S10103C84) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 Fp Fi FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m FC11{ m FL[2]}} Fi} vd v1 v2 v3 v4 FC4[4] FC10 FC10 FC10 FC10 Fi[6]}


 S10103C84 ::~S10103C84(){ note_dtor("S10103C84", this);}
void  S10103C84 ::v148(){vfunc_called(this, "_ZN9S10103C844v148Ev");}
void  S10103C84 ::v149(){vfunc_called(this, "_ZN9S10103C844v149Ev");}
void  S10103C84 ::v150(){vfunc_called(this, "_ZN9S10103C844v150Ev");}
void  S10103C84 ::v151(){vfunc_called(this, "_ZN9S10103C844v151Ev");}
S10103C84 ::S10103C84(){ note_ctor("S10103C84", this);} // tgen

static void Test_S10103C84()
{
  extern Class_Descriptor cd_S10103C84;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(38,57)];
    init_test(&cd_S10103C84, buf);
    S10103C84 *dp, &lv = *(dp=new (buf) S10103C84());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(296,224), "sizeof(S10103C84)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C84)");
    check_base_class_offset(lv, (S10103C76*)(S10103C85*), 0, "S10103C84");
    check_base_class_offset(lv, (S10103C85*), 0, "S10103C84");
    check_field_offset(lv, s10103c84f0, ABISELECT(112,72), "S10103C84.s10103c84f0");
    check_field_offset(lv, s10103c84f1, ABISELECT(208,136), "S10103C84.s10103c84f1");
    check_field_offset(lv, s10103c84f2, ABISELECT(224,152), "S10103C84.s10103c84f2");
    check_field_offset(lv, s10103c84f3, ABISELECT(240,168), "S10103C84.s10103c84f3");
    check_field_offset(lv, s10103c84f4, ABISELECT(256,184), "S10103C84.s10103c84f4");
    check_field_offset(lv, s10103c84f5, ABISELECT(272,200), "S10103C84.s10103c84f5");
    test_class_info(&lv, &cd_S10103C84);
    dp->~S10103C84();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C84(Test_S10103C84, "S10103C84", ABISELECT(296,224));

#else // __cplusplus

extern void _ZN9S10103C84C1Ev();
extern void _ZN9S10103C84D1Ev();
Name_Map name_map_S10103C84[] = {
  NSPAIR(_ZN9S10103C84C1Ev),
  NSPAIR(_ZN9S10103C84D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C76;
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
extern Class_Descriptor cd_S10103C85;
extern VTBL_ENTRY _ZTI9S10103C85[];
extern  VTBL_ENTRY _ZTV9S10103C85[];
static Base_Class bases_S10103C84[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C76,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C85,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C84[];
extern void _ZN9S10103C84D1Ev();
extern void _ZN9S10103C84D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
extern void _ZN9S10103C854v152Ev();
extern void _ZN9S10103C854v153Ev();
extern void _ZN9S10103C854v154Ev();
extern void _ZN9S10103C854v155Ev();
extern void _ZN9S10103C854v156Ev();
extern void _ZN9S10103C854v157Ev();
extern void _ZN9S10103C844v148Ev();
extern void _ZN9S10103C844v149Ev();
extern void _ZN9S10103C844v150Ev();
extern void _ZN9S10103C844v151Ev();
static  VTBL_ENTRY vtc_S10103C84[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C84[0]),
  (VTBL_ENTRY)&_ZN9S10103C84D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C84D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v152Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v153Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v154Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v155Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v156Ev,
  (VTBL_ENTRY)&_ZN9S10103C854v157Ev,
  (VTBL_ENTRY)&_ZN9S10103C844v148Ev,
  (VTBL_ENTRY)&_ZN9S10103C844v149Ev,
  (VTBL_ENTRY)&_ZN9S10103C844v150Ev,
  (VTBL_ENTRY)&_ZN9S10103C844v151Ev,
};
extern VTBL_ENTRY _ZTI9S10103C84[];
extern  VTBL_ENTRY _ZTV9S10103C84[];
Class_Descriptor cd_S10103C84 = {  "S10103C84", // class name
  bases_S10103C84, 2,
  &(vtc_S10103C84[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(296,224), // object size
  NSPAIRA(_ZTI9S10103C84),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C84),24, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C74  : S10103C75 {
  ::S10103C84 s10103c74f0;
  ::S10103C82_nt s10103c74f1;
  ::S10103C82_nt s10103c74f2;
  virtual void  v144(); // _ZN9S10103C744v144Ev
  virtual void  v145(); // _ZN9S10103C744v145Ev
  virtual void  v146(); // _ZN9S10103C744v146Ev
  virtual void  v147(); // _ZN9S10103C744v147Ev
  ~S10103C74(); // tgen
  S10103C74(); // tgen
};
//SIG(-1 S10103C74) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC8} FC9{ m Fp Fi[2] FC10{ m}} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 FC13{ BC14{ BC3 vd v33 v34 v35 v36 v37 v38 Fp Fi FC15{ m Fp Fi FC10 FC16{ m}} FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]} FC11 FC11}


void  S10103C74 ::v144(){vfunc_called(this, "_ZN9S10103C744v144Ev");}
void  S10103C74 ::v145(){vfunc_called(this, "_ZN9S10103C744v145Ev");}
void  S10103C74 ::v146(){vfunc_called(this, "_ZN9S10103C744v146Ev");}
void  S10103C74 ::v147(){vfunc_called(this, "_ZN9S10103C744v147Ev");}
S10103C74 ::~S10103C74(){ note_dtor("S10103C74", this);} // tgen
S10103C74 ::S10103C74(){ note_ctor("S10103C74", this);} // tgen

static void Test_S10103C74()
{
  extern Class_Descriptor cd_S10103C74;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(59,88)];
    init_test(&cd_S10103C74, buf);
    S10103C74 *dp, &lv = *(dp=new (buf) S10103C74());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(464,348), "sizeof(S10103C74)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C74)");
    check_base_class_offset(lv, (S10103C76*)(S10103C75*), 0, "S10103C74");
    check_base_class_offset(lv, (S10103C75*), 0, "S10103C74");
    check_field_offset(lv, s10103c74f0, ABISELECT(136,92), "S10103C74.s10103c74f0");
    check_field_offset(lv, s10103c74f1, ABISELECT(432,316), "S10103C74.s10103c74f1");
    check_field_offset(lv, s10103c74f2, ABISELECT(448,332), "S10103C74.s10103c74f2");
    test_class_info(&lv, &cd_S10103C74);
    dp->~S10103C74();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C74(Test_S10103C74, "S10103C74", ABISELECT(464,348));

#else // __cplusplus

extern void _ZN9S10103C74C1Ev();
extern void _ZN9S10103C74D1Ev();
Name_Map name_map_S10103C74[] = {
  NSPAIR(_ZN9S10103C74C1Ev),
  NSPAIR(_ZN9S10103C74D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C76;
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
extern Class_Descriptor cd_S10103C75;
extern VTBL_ENTRY _ZTI9S10103C75[];
extern  VTBL_ENTRY _ZTV9S10103C75[];
static Base_Class bases_S10103C74[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C76,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C75,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C74[];
extern void _ZN9S10103C74D1Ev();
extern void _ZN9S10103C74D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
extern void _ZN9S10103C754v130Ev();
extern void _ZN9S10103C754v131Ev();
extern void _ZN9S10103C754v132Ev();
extern void _ZN9S10103C754v133Ev();
extern void _ZN9S10103C754v134Ev();
extern void _ZN9S10103C754v135Ev();
extern void _ZN9S10103C754v136Ev();
extern void _ZN9S10103C754v137Ev();
extern void _ZN9S10103C754v138Ev();
extern void _ZN9S10103C754v139Ev();
extern void _ZN9S10103C754v140Ev();
extern void _ZN9S10103C754v141Ev();
extern void _ZN9S10103C754v142Ev();
extern void _ZN9S10103C754v143Ev();
extern void _ZN9S10103C744v144Ev();
extern void _ZN9S10103C744v145Ev();
extern void _ZN9S10103C744v146Ev();
extern void _ZN9S10103C744v147Ev();
static  VTBL_ENTRY vtc_S10103C74[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C74[0]),
  (VTBL_ENTRY)&_ZN9S10103C74D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C74D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v130Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v131Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v132Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v133Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v134Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v135Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v136Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v137Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v138Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v139Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v140Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v141Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v142Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v143Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v144Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v145Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v146Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v147Ev,
};
extern VTBL_ENTRY _ZTI9S10103C74[];
extern  VTBL_ENTRY _ZTV9S10103C74[];
Class_Descriptor cd_S10103C74 = {  "S10103C74", // class name
  bases_S10103C74, 2,
  &(vtc_S10103C74[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(464,348), // object size
  NSPAIRA(_ZTI9S10103C74),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C74),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C73  : S10103C74 {
  ::S10103C30_nt s10103c73f0;
  ::S10103C82_nt s10103c73f1;
  virtual void  v116(); // _ZN9S10103C734v116Ev
  virtual void  v117(); // _ZN9S10103C734v117Ev
  virtual void  v118(); // _ZN9S10103C734v118Ev
  virtual void  v119(); // _ZN9S10103C734v119Ev
  ~S10103C73(); // tgen
  S10103C73(); // tgen
};
//SIG(-1 S10103C73) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC9} FC10{ m Fp Fi[2] FC11{ m}} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 FC14{ BC15{ BC4 vd v37 v38 v39 v40 v41 v42 Fp Fi FC16{ m Fp Fi FC11 FC17{ m}} FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC12 FC12} v1 v2 v3 v4 FC18{ m FC19{ m FL}} FC12}


void  S10103C73 ::v116(){vfunc_called(this, "_ZN9S10103C734v116Ev");}
void  S10103C73 ::v117(){vfunc_called(this, "_ZN9S10103C734v117Ev");}
void  S10103C73 ::v118(){vfunc_called(this, "_ZN9S10103C734v118Ev");}
void  S10103C73 ::v119(){vfunc_called(this, "_ZN9S10103C734v119Ev");}
S10103C73 ::~S10103C73(){ note_dtor("S10103C73", this);} // tgen
S10103C73 ::S10103C73(){ note_ctor("S10103C73", this);} // tgen

static void Test_S10103C73()
{
  extern Class_Descriptor cd_S10103C73;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(62,94)];
    init_test(&cd_S10103C73, buf);
    S10103C73 *dp, &lv = *(dp=new (buf) S10103C73());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(488,372), "sizeof(S10103C73)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C73)");
    check_base_class_offset(lv, (S10103C76*)(S10103C75*)(S10103C74*), 0, "S10103C73");
    check_base_class_offset(lv, (S10103C75*)(S10103C74*), 0, "S10103C73");
    check_base_class_offset(lv, (S10103C74*), 0, "S10103C73");
    check_field_offset(lv, s10103c73f0, ABISELECT(464,348), "S10103C73.s10103c73f0");
    check_field_offset(lv, s10103c73f1, ABISELECT(472,356), "S10103C73.s10103c73f1");
    test_class_info(&lv, &cd_S10103C73);
    dp->~S10103C73();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C73(Test_S10103C73, "S10103C73", ABISELECT(488,372));

#else // __cplusplus

extern void _ZN9S10103C73C1Ev();
extern void _ZN9S10103C73D1Ev();
Name_Map name_map_S10103C73[] = {
  NSPAIR(_ZN9S10103C73C1Ev),
  NSPAIR(_ZN9S10103C73D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C76;
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
extern Class_Descriptor cd_S10103C75;
extern VTBL_ENTRY _ZTI9S10103C75[];
extern  VTBL_ENTRY _ZTV9S10103C75[];
extern Class_Descriptor cd_S10103C74;
extern VTBL_ENTRY _ZTI9S10103C74[];
extern  VTBL_ENTRY _ZTV9S10103C74[];
static Base_Class bases_S10103C73[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C76,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10103C75,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C74,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C73[];
extern void _ZN9S10103C73D1Ev();
extern void _ZN9S10103C73D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
extern void _ZN9S10103C754v130Ev();
extern void _ZN9S10103C754v131Ev();
extern void _ZN9S10103C754v132Ev();
extern void _ZN9S10103C754v133Ev();
extern void _ZN9S10103C754v134Ev();
extern void _ZN9S10103C754v135Ev();
extern void _ZN9S10103C754v136Ev();
extern void _ZN9S10103C754v137Ev();
extern void _ZN9S10103C754v138Ev();
extern void _ZN9S10103C754v139Ev();
extern void _ZN9S10103C754v140Ev();
extern void _ZN9S10103C754v141Ev();
extern void _ZN9S10103C754v142Ev();
extern void _ZN9S10103C754v143Ev();
extern void _ZN9S10103C744v144Ev();
extern void _ZN9S10103C744v145Ev();
extern void _ZN9S10103C744v146Ev();
extern void _ZN9S10103C744v147Ev();
extern void _ZN9S10103C734v116Ev();
extern void _ZN9S10103C734v117Ev();
extern void _ZN9S10103C734v118Ev();
extern void _ZN9S10103C734v119Ev();
static  VTBL_ENTRY vtc_S10103C73[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C73[0]),
  (VTBL_ENTRY)&_ZN9S10103C73D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C73D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v130Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v131Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v132Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v133Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v134Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v135Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v136Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v137Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v138Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v139Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v140Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v141Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v142Ev,
  (VTBL_ENTRY)&_ZN9S10103C754v143Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v144Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v145Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v146Ev,
  (VTBL_ENTRY)&_ZN9S10103C744v147Ev,
  (VTBL_ENTRY)&_ZN9S10103C734v116Ev,
  (VTBL_ENTRY)&_ZN9S10103C734v117Ev,
  (VTBL_ENTRY)&_ZN9S10103C734v118Ev,
  (VTBL_ENTRY)&_ZN9S10103C734v119Ev,
};
extern VTBL_ENTRY _ZTI9S10103C73[];
extern  VTBL_ENTRY _ZTV9S10103C73[];
Class_Descriptor cd_S10103C73 = {  "S10103C73", // class name
  bases_S10103C73, 3,
  &(vtc_S10103C73[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(488,372), // object size
  NSPAIRA(_ZTI9S10103C73),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C73),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C91  : S10103C76 {
  void *s10103c91f0[2];
  ::S10103C82_nt s10103c91f1;
  ::S10103C82_nt s10103c91f2;
  ::S10103C82_nt s10103c91f3;
  int s10103c91f4[13];
  void *s10103c91f5[3];
  int s10103c91f6[3];
  virtual  ~S10103C91(); // _ZN9S10103C91D1Ev
  virtual void  v158(); // _ZN9S10103C914v158Ev
  virtual void  v159(); // _ZN9S10103C914v159Ev
  virtual void  v160(); // _ZN9S10103C914v160Ev
  virtual void  v161(); // _ZN9S10103C914v161Ev
  virtual void  v162(); // _ZN9S10103C914v162Ev
  virtual void  v163(); // _ZN9S10103C914v163Ev
  S10103C91(); // tgen
};
//SIG(-1 S10103C91) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp[2] FC6{ m FC7{ m FL[2]}} FC6 FC6 Fi[13] Fp[3] Fi[3]}


 S10103C91 ::~S10103C91(){ note_dtor("S10103C91", this);}
void  S10103C91 ::v158(){vfunc_called(this, "_ZN9S10103C914v158Ev");}
void  S10103C91 ::v159(){vfunc_called(this, "_ZN9S10103C914v159Ev");}
void  S10103C91 ::v160(){vfunc_called(this, "_ZN9S10103C914v160Ev");}
void  S10103C91 ::v161(){vfunc_called(this, "_ZN9S10103C914v161Ev");}
void  S10103C91 ::v162(){vfunc_called(this, "_ZN9S10103C914v162Ev");}
void  S10103C91 ::v163(){vfunc_called(this, "_ZN9S10103C914v163Ev");}
S10103C91 ::S10103C91(){ note_ctor("S10103C91", this);} // tgen

static void Test_S10103C91()
{
  extern Class_Descriptor cd_S10103C91;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,42)];
    init_test(&cd_S10103C91, buf);
    S10103C91 *dp, &lv = *(dp=new (buf) S10103C91());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,164), "sizeof(S10103C91)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C91)");
    check_base_class_offset(lv, (S10103C76*), 0, "S10103C91");
    check_field_offset(lv, s10103c91f0, ABISELECT(56,32), "S10103C91.s10103c91f0");
    check_field_offset(lv, s10103c91f1, ABISELECT(72,40), "S10103C91.s10103c91f1");
    check_field_offset(lv, s10103c91f2, ABISELECT(88,56), "S10103C91.s10103c91f2");
    check_field_offset(lv, s10103c91f3, ABISELECT(104,72), "S10103C91.s10103c91f3");
    check_field_offset(lv, s10103c91f4, ABISELECT(120,88), "S10103C91.s10103c91f4");
    check_field_offset(lv, s10103c91f5, ABISELECT(176,140), "S10103C91.s10103c91f5");
    check_field_offset(lv, s10103c91f6, ABISELECT(200,152), "S10103C91.s10103c91f6");
    test_class_info(&lv, &cd_S10103C91);
    dp->~S10103C91();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C91(Test_S10103C91, "S10103C91", ABISELECT(216,164));

#else // __cplusplus

extern void _ZN9S10103C91C1Ev();
extern void _ZN9S10103C91D1Ev();
Name_Map name_map_S10103C91[] = {
  NSPAIR(_ZN9S10103C91C1Ev),
  NSPAIR(_ZN9S10103C91D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C76;
extern VTBL_ENTRY _ZTI9S10103C76[];
extern  VTBL_ENTRY _ZTV9S10103C76[];
static Base_Class bases_S10103C91[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C76,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C91[];
extern void _ZN9S10103C91D1Ev();
extern void _ZN9S10103C91D0Ev();
extern void _ZN9S10103C764v120Ev();
extern void _ZN9S10103C764v121Ev();
extern void _ZN9S10103C764v122Ev();
extern void _ZN9S10103C764v123Ev();
extern void _ZN9S10103C764v124Ev();
extern void _ZN9S10103C764v125Ev();
extern void _ZN9S10103C764v126Ev();
extern void _ZN9S10103C764v127Ev();
extern void _ZN9S10103C764v128Ev();
extern void _ZN9S10103C764v129Ev();
extern void _ZN9S10103C914v158Ev();
extern void _ZN9S10103C914v159Ev();
extern void _ZN9S10103C914v160Ev();
extern void _ZN9S10103C914v161Ev();
extern void _ZN9S10103C914v162Ev();
extern void _ZN9S10103C914v163Ev();
static  VTBL_ENTRY vtc_S10103C91[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C91[0]),
  (VTBL_ENTRY)&_ZN9S10103C91D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C91D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v120Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v121Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v122Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v123Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v124Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v125Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v126Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v127Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v128Ev,
  (VTBL_ENTRY)&_ZN9S10103C764v129Ev,
  (VTBL_ENTRY)&_ZN9S10103C914v158Ev,
  (VTBL_ENTRY)&_ZN9S10103C914v159Ev,
  (VTBL_ENTRY)&_ZN9S10103C914v160Ev,
  (VTBL_ENTRY)&_ZN9S10103C914v161Ev,
  (VTBL_ENTRY)&_ZN9S10103C914v162Ev,
  (VTBL_ENTRY)&_ZN9S10103C914v163Ev,
};
extern VTBL_ENTRY _ZTI9S10103C91[];
extern  VTBL_ENTRY _ZTV9S10103C91[];
Class_Descriptor cd_S10103C91 = {  "S10103C91", // class name
  bases_S10103C91, 1,
  &(vtc_S10103C91[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,164), // object size
  NSPAIRA(_ZTI9S10103C91),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C91),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C96  {
  __tsi64 s10103c96f0[2];
  int s10103c96f1;
  ::S10103C14_nt s10103c96f2;
  ::S10103C14_nt s10103c96f3;
  ::S10103C14_nt s10103c96f4;
  ::S10103C14_nt s10103c96f5;
  ::S10103C54_nt s10103c96f6;
  void  mf10103c96(); // _ZN9S10103C9610mf10103c96Ev
  virtual  ~S10103C96(); // _ZN9S10103C96D1Ev
  S10103C96(); // tgen
};
//SIG(-1 S10103C96) C1{ vd m FL[2] Fi FC2{ m Fp Fi FC3{ m}} FC2 FC2 FC2 FC4{ m Fp}}


void  S10103C96 ::mf10103c96(){}
 S10103C96 ::~S10103C96(){ note_dtor("S10103C96", this);}
S10103C96 ::S10103C96(){ note_ctor("S10103C96", this);} // tgen

static void Test_S10103C96()
{
  extern Class_Descriptor cd_S10103C96;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(14,20)];
    init_test(&cd_S10103C96, buf);
    S10103C96 *dp, &lv = *(dp=new (buf) S10103C96());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(104,76), "sizeof(S10103C96)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C96)");
    check_field_offset(lv, s10103c96f0, ABISELECT(8,4), "S10103C96.s10103c96f0");
    check_field_offset(lv, s10103c96f1, ABISELECT(24,20), "S10103C96.s10103c96f1");
    check_field_offset(lv, s10103c96f2, ABISELECT(32,24), "S10103C96.s10103c96f2");
    check_field_offset(lv, s10103c96f3, ABISELECT(48,36), "S10103C96.s10103c96f3");
    check_field_offset(lv, s10103c96f4, ABISELECT(64,48), "S10103C96.s10103c96f4");
    check_field_offset(lv, s10103c96f5, ABISELECT(80,60), "S10103C96.s10103c96f5");
    check_field_offset(lv, s10103c96f6, ABISELECT(96,72), "S10103C96.s10103c96f6");
    test_class_info(&lv, &cd_S10103C96);
    dp->~S10103C96();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C96(Test_S10103C96, "S10103C96", ABISELECT(104,76));

#else // __cplusplus

extern void _ZN9S10103C96C1Ev();
extern void _ZN9S10103C96D1Ev();
Name_Map name_map_S10103C96[] = {
  NSPAIR(_ZN9S10103C96C1Ev),
  NSPAIR(_ZN9S10103C96D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10103C96[];
extern void _ZN9S10103C96D1Ev();
extern void _ZN9S10103C96D0Ev();
static  VTBL_ENTRY vtc_S10103C96[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C96[0]),
  (VTBL_ENTRY)&_ZN9S10103C96D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C96D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C96[];
extern  VTBL_ENTRY _ZTV9S10103C96[];
Class_Descriptor cd_S10103C96 = {  "S10103C96", // class name
  0,0,//no base classes
  &(vtc_S10103C96[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(104,76), // object size
  NSPAIRA(_ZTI9S10103C96),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10103C96),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C92  {
  void *s10103c92f0[2];
  ::S10103C86 s10103c92f1;
  ::S10103C96 s10103c92f2;
  void  mf10103c92(); // _ZN9S10103C9210mf10103c92Ev
  virtual  ~S10103C92(); // _ZN9S10103C92D1Ev
  S10103C92(); // tgen
};
//SIG(-1 S10103C92) C1{ vd m Fp[2] FC2{ m Fp Fi FC3{ m} FC4{ m}} FC5{ vd m FL[2] Fi FC6{ m Fp Fi FC7{ m}} FC6 FC6 FC6 FC8{ m Fp}}}


void  S10103C92 ::mf10103c92(){}
 S10103C92 ::~S10103C92(){ note_dtor("S10103C92", this);}
S10103C92 ::S10103C92(){ note_ctor("S10103C92", this);} // tgen

static void Test_S10103C92()
{
  extern Class_Descriptor cd_S10103C92;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(19,26)];
    init_test(&cd_S10103C92, buf);
    S10103C92 *dp, &lv = *(dp=new (buf) S10103C92());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(144,100), "sizeof(S10103C92)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C92)");
    check_field_offset(lv, s10103c92f0, ABISELECT(8,4), "S10103C92.s10103c92f0");
    check_field_offset(lv, s10103c92f1, ABISELECT(24,12), "S10103C92.s10103c92f1");
    check_field_offset(lv, s10103c92f2, ABISELECT(40,24), "S10103C92.s10103c92f2");
    test_class_info(&lv, &cd_S10103C92);
    dp->~S10103C92();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C92(Test_S10103C92, "S10103C92", ABISELECT(144,100));

#else // __cplusplus

extern void _ZN9S10103C92C1Ev();
extern void _ZN9S10103C92D1Ev();
Name_Map name_map_S10103C92[] = {
  NSPAIR(_ZN9S10103C92C1Ev),
  NSPAIR(_ZN9S10103C92D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10103C92[];
extern void _ZN9S10103C92D1Ev();
extern void _ZN9S10103C92D0Ev();
static  VTBL_ENTRY vtc_S10103C92[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C92[0]),
  (VTBL_ENTRY)&_ZN9S10103C92D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C92D0Ev,
};
extern VTBL_ENTRY _ZTI9S10103C92[];
extern  VTBL_ENTRY _ZTV9S10103C92[];
Class_Descriptor cd_S10103C92 = {  "S10103C92", // class name
  0,0,//no base classes
  &(vtc_S10103C92[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(144,100), // object size
  NSPAIRA(_ZTI9S10103C92),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10103C92),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C62  : S10103C5_nt , S10103C12 {
  ::S10103C54_nt s10103c62f0;
  ::S10103C64 s10103c62f1;
  ::S10103C64 s10103c62f2;
  int s10103c62f3[2];
  ::S10103C66 s10103c62f4;
  void *s10103c62f5;
  ::S10103C68 s10103c62f6;
  char s10103c62f7;
  ::S10103C73 s10103c62f8;
  ::S10103C91 s10103c62f9;
  ::S10103C25_nt s10103c62f10[2];
  ::S10103C25_nt s10103c62f11[2];
  ::S10103C82_nt s10103c62f12;
  ::S10103C92 s10103c62f13;
  ::S10103C13_nt s10103c62f14;
  void *s10103c62f15[2];
  ::S10103C13_nt s10103c62f16;
  void *s10103c62f17[3];
  char s10103c62f18;
  virtual  ~S10103C62(); // _ZN9S10103C62D1Ev
  virtual void  v99(); // _ZN9S10103C623v99Ev
  virtual void  v100(); // _ZN9S10103C624v100Ev
  virtual void  v101(); // _ZN9S10103C624v101Ev
  virtual void  v102(); // _ZN9S10103C624v102Ev
  virtual void  v103(); // _ZN9S10103C624v103Ev
  virtual void  v104(); // _ZN9S10103C624v104Ev
  virtual void  v105(); // _ZN9S10103C624v105Ev
  virtual void  v106(); // _ZN9S10103C624v106Ev
  virtual void  v107(); // _ZN9S10103C624v107Ev
  virtual void  v108(); // _ZN9S10103C624v108Ev
  virtual void  v109(); // _ZN9S10103C624v109Ev
  virtual void  v110(); // _ZN9S10103C624v110Ev
  virtual void  v111(); // _ZN9S10103C624v111Ev
  S10103C62(); // tgen
};
//SIG(-1 S10103C62) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 FC11{ m Fp} FC12{ m Fp} FC12 Fi[2] FC13{ BC14{ vd v38 v39} FC7 Fi FL[2] Fi} Fp FC15{ m Fp[2] FC16{ vd v40 v41 FC17{ m Fp Fi[2] FC18{ m}} FC19{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]} Fc FC20{ BC21{ BC22{ BC23{ vd v46 v47 v48 v49 v50 v51 v52 v53 v54 v55 Fp[2] FC6 Fp} vd v56 v57 v58 v59 v60 v61 v62 v63 v64 v65 v66 v67 v68 v69 FC24{ m Fp Fi FC25{ m} FC25} FC17 FC26{ m FC27{ m FL[2]}} FC6} v70 v71 v72 v73 FC28{ BC29{ BC23 vd v78 v79 v80 v81 v82 v83 Fp Fi FC30{ m Fp Fi FC18 FC31{ m}} FC26 Fi} vd v74 v75 v76 v77 FC6[4] FC26 FC26 FC26 FC26 Fi[6]} FC26 FC26} v42 v43 v44 v45 FC32{ m FC33{ m FL}} FC26} FC34{ BC23 vd v84 v85 v86 v87 v88 v89 Fp[2] FC26 FC26 FC26 Fi[13] Fp[3] Fi[3]} FC35{ Fi[4]}[2] FC35[2] FC26 FC36{ vd m Fp[2] FC30 FC37{ vd m FL[2] Fi FC7 FC7 FC7 FC7 FC11}} FC6 Fp[2] FC6 Fp[3] Fc}


 S10103C62 ::~S10103C62(){ note_dtor("S10103C62", this);}
void  S10103C62 ::v99(){vfunc_called(this, "_ZN9S10103C623v99Ev");}
void  S10103C62 ::v100(){vfunc_called(this, "_ZN9S10103C624v100Ev");}
void  S10103C62 ::v101(){vfunc_called(this, "_ZN9S10103C624v101Ev");}
void  S10103C62 ::v102(){vfunc_called(this, "_ZN9S10103C624v102Ev");}
void  S10103C62 ::v103(){vfunc_called(this, "_ZN9S10103C624v103Ev");}
void  S10103C62 ::v104(){vfunc_called(this, "_ZN9S10103C624v104Ev");}
void  S10103C62 ::v105(){vfunc_called(this, "_ZN9S10103C624v105Ev");}
void  S10103C62 ::v106(){vfunc_called(this, "_ZN9S10103C624v106Ev");}
void  S10103C62 ::v107(){vfunc_called(this, "_ZN9S10103C624v107Ev");}
void  S10103C62 ::v108(){vfunc_called(this, "_ZN9S10103C624v108Ev");}
void  S10103C62 ::v109(){vfunc_called(this, "_ZN9S10103C624v109Ev");}
void  S10103C62 ::v110(){vfunc_called(this, "_ZN9S10103C624v110Ev");}
void  S10103C62 ::v111(){vfunc_called(this, "_ZN9S10103C624v111Ev");}
S10103C62 ::S10103C62(){ note_ctor("S10103C62", this);} // tgen

static void Test_S10103C62()
{
  extern Class_Descriptor cd_S10103C62;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(180,264)];
    init_test(&cd_S10103C62, buf);
    S10103C62 *dp, &lv = *(dp=new (buf) S10103C62());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1432,1052), "sizeof(S10103C62)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C62)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C62");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C62");
    check_field_offset(lv, s10103c62f0, ABISELECT(168,112), "S10103C62.s10103c62f0");
    check_field_offset(lv, s10103c62f1, ABISELECT(176,116), "S10103C62.s10103c62f1");
    check_field_offset(lv, s10103c62f2, ABISELECT(184,120), "S10103C62.s10103c62f2");
    check_field_offset(lv, s10103c62f3, ABISELECT(192,124), "S10103C62.s10103c62f3");
    check_field_offset(lv, s10103c62f4, ABISELECT(200,132), "S10103C62.s10103c62f4");
    check_field_offset(lv, s10103c62f5, ABISELECT(256,172), "S10103C62.s10103c62f5");
    check_field_offset(lv, s10103c62f6, ABISELECT(264,176), "S10103C62.s10103c62f6");
    check_field_offset(lv, s10103c62f7, ABISELECT(400,276), "S10103C62.s10103c62f7");
    check_field_offset(lv, s10103c62f8, ABISELECT(408,280), "S10103C62.s10103c62f8");
    check_field_offset(lv, s10103c62f9, ABISELECT(896,652), "S10103C62.s10103c62f9");
    check_field_offset(lv, s10103c62f10, ABISELECT(1112,816), "S10103C62.s10103c62f10");
    check_field_offset(lv, s10103c62f11, ABISELECT(1144,848), "S10103C62.s10103c62f11");
    check_field_offset(lv, s10103c62f12, ABISELECT(1176,880), "S10103C62.s10103c62f12");
    check_field_offset(lv, s10103c62f13, ABISELECT(1192,896), "S10103C62.s10103c62f13");
    check_field_offset(lv, s10103c62f14, ABISELECT(1336,996), "S10103C62.s10103c62f14");
    check_field_offset(lv, s10103c62f15, ABISELECT(1360,1012), "S10103C62.s10103c62f15");
    check_field_offset(lv, s10103c62f16, ABISELECT(1376,1020), "S10103C62.s10103c62f16");
    check_field_offset(lv, s10103c62f17, ABISELECT(1400,1036), "S10103C62.s10103c62f17");
    check_field_offset(lv, s10103c62f18, ABISELECT(1424,1048), "S10103C62.s10103c62f18");
    test_class_info(&lv, &cd_S10103C62);
    dp->~S10103C62();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C62(Test_S10103C62, "S10103C62", ABISELECT(1432,1052));

#else // __cplusplus

extern void _ZN9S10103C62C1Ev();
extern void _ZN9S10103C62D1Ev();
Name_Map name_map_S10103C62[] = {
  NSPAIR(_ZN9S10103C62C1Ev),
  NSPAIR(_ZN9S10103C62D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C62[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C62[];
extern void _ZN9S10103C62D1Ev();
extern void _ZN9S10103C62D0Ev();
extern void _ZN9S10103C623v99Ev();
extern void _ZN9S10103C624v100Ev();
extern void _ZN9S10103C624v101Ev();
extern void _ZN9S10103C624v102Ev();
extern void _ZN9S10103C624v103Ev();
extern void _ZN9S10103C624v104Ev();
extern void _ZN9S10103C624v105Ev();
extern void _ZN9S10103C624v106Ev();
extern void _ZN9S10103C624v107Ev();
extern void _ZN9S10103C624v108Ev();
extern void _ZN9S10103C624v109Ev();
extern void _ZN9S10103C624v110Ev();
extern void _ZN9S10103C624v111Ev();
extern void ABISELECT(_ZThn48_N9S10103C62D1Ev,_ZThn32_N9S10103C62D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C62D0Ev,_ZThn32_N9S10103C62D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C62[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C62[0]),
  (VTBL_ENTRY)&_ZN9S10103C62D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C62D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C623v99Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v100Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v101Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v102Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v103Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v104Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v105Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v106Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v107Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v108Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v109Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v110Ev,
  (VTBL_ENTRY)&_ZN9S10103C624v111Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C62[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C62D1Ev,_ZThn32_N9S10103C62D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C62D0Ev,_ZThn32_N9S10103C62D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C62[];
extern  VTBL_ENTRY _ZTV9S10103C62[];
Class_Descriptor cd_S10103C62 = {  "S10103C62", // class name
  bases_S10103C62, 2,
  &(vtc_S10103C62[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1432,1052), // object size
  NSPAIRA(_ZTI9S10103C62),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C62),45, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C98  : S10103C5_nt , S10103C12 {
  ::S10103C96 s10103c98f0;
  __tsi64 s10103c98f1;
  int s10103c98f2;
  virtual  ~S10103C98(); // _ZN9S10103C98D1Ev
  virtual void  v167(); // _ZN9S10103C984v167Ev
  virtual void  v168(); // _ZN9S10103C984v168Ev
  virtual void  v169(); // _ZN9S10103C984v169Ev
  S10103C98(); // tgen
};
//SIG(-1 S10103C98) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 FC11{ vd m FL[2] Fi FC7 FC7 FC7 FC7 FC12{ m Fp}} FL Fi}


 S10103C98 ::~S10103C98(){ note_dtor("S10103C98", this);}
void  S10103C98 ::v167(){vfunc_called(this, "_ZN9S10103C984v167Ev");}
void  S10103C98 ::v168(){vfunc_called(this, "_ZN9S10103C984v168Ev");}
void  S10103C98 ::v169(){vfunc_called(this, "_ZN9S10103C984v169Ev");}
S10103C98 ::S10103C98(){ note_ctor("S10103C98", this);} // tgen

static void Test_S10103C98()
{
  extern Class_Descriptor cd_S10103C98;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(37,51)];
    init_test(&cd_S10103C98, buf);
    S10103C98 *dp, &lv = *(dp=new (buf) S10103C98());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(288,200), "sizeof(S10103C98)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C98)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C98");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C98");
    check_field_offset(lv, s10103c98f0, ABISELECT(168,112), "S10103C98.s10103c98f0");
    check_field_offset(lv, s10103c98f1, ABISELECT(272,188), "S10103C98.s10103c98f1");
    check_field_offset(lv, s10103c98f2, ABISELECT(280,196), "S10103C98.s10103c98f2");
    test_class_info(&lv, &cd_S10103C98);
    dp->~S10103C98();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C98(Test_S10103C98, "S10103C98", ABISELECT(288,200));

#else // __cplusplus

extern void _ZN9S10103C98C1Ev();
extern void _ZN9S10103C98D1Ev();
Name_Map name_map_S10103C98[] = {
  NSPAIR(_ZN9S10103C98C1Ev),
  NSPAIR(_ZN9S10103C98D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C98[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C98[];
extern void _ZN9S10103C98D1Ev();
extern void _ZN9S10103C98D0Ev();
extern void _ZN9S10103C984v167Ev();
extern void _ZN9S10103C984v168Ev();
extern void _ZN9S10103C984v169Ev();
extern void ABISELECT(_ZThn48_N9S10103C98D1Ev,_ZThn32_N9S10103C98D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C98D0Ev,_ZThn32_N9S10103C98D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C98[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C98[0]),
  (VTBL_ENTRY)&_ZN9S10103C98D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C98D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C984v167Ev,
  (VTBL_ENTRY)&_ZN9S10103C984v168Ev,
  (VTBL_ENTRY)&_ZN9S10103C984v169Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C98[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C98D1Ev,_ZThn32_N9S10103C98D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C98D0Ev,_ZThn32_N9S10103C98D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C98[];
extern  VTBL_ENTRY _ZTV9S10103C98[];
Class_Descriptor cd_S10103C98 = {  "S10103C98", // class name
  bases_S10103C98, 2,
  &(vtc_S10103C98[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(288,200), // object size
  NSPAIRA(_ZTI9S10103C98),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C98),35, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C97  : S10103C98 {
  virtual  ~S10103C97(); // _ZN9S10103C97D1Ev
  virtual void  v164(); // _ZN9S10103C974v164Ev
  virtual void  v165(); // _ZN9S10103C974v165Ev
  virtual void  v166(); // _ZN9S10103C974v166Ev
  S10103C97(); // tgen
};
//SIG(-1 S10103C97) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v28 v29 v30 FC12{ vd m FL[2] Fi FC8 FC8 FC8 FC8 FC13{ m Fp}} FL Fi} vd v1 v2 v3}


 S10103C97 ::~S10103C97(){ note_dtor("S10103C97", this);}
void  S10103C97 ::v164(){vfunc_called(this, "_ZN9S10103C974v164Ev");}
void  S10103C97 ::v165(){vfunc_called(this, "_ZN9S10103C974v165Ev");}
void  S10103C97 ::v166(){vfunc_called(this, "_ZN9S10103C974v166Ev");}
S10103C97 ::S10103C97(){ note_ctor("S10103C97", this);} // tgen

static void Test_S10103C97()
{
  extern Class_Descriptor cd_S10103C97;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(37,51)];
    init_test(&cd_S10103C97, buf);
    S10103C97 *dp, &lv = *(dp=new (buf) S10103C97());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(288,200), "sizeof(S10103C97)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C97)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C98*), 0, "S10103C97");
    check_base_class_offset(lv, (S10103C12*)(S10103C98*), ABISELECT(48,32), "S10103C97");
    check_base_class_offset(lv, (S10103C98*), 0, "S10103C97");
    test_class_info(&lv, &cd_S10103C97);
    dp->~S10103C97();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C97(Test_S10103C97, "S10103C97", ABISELECT(288,200));

#else // __cplusplus

extern void _ZN9S10103C97C1Ev();
extern void _ZN9S10103C97D1Ev();
Name_Map name_map_S10103C97[] = {
  NSPAIR(_ZN9S10103C97C1Ev),
  NSPAIR(_ZN9S10103C97D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
extern Class_Descriptor cd_S10103C98;
extern VTBL_ENTRY _ZTI9S10103C98[];
extern  VTBL_ENTRY _ZTV9S10103C98[];
static Base_Class bases_S10103C97[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C98,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C97[];
extern void _ZN9S10103C97D1Ev();
extern void _ZN9S10103C97D0Ev();
extern void _ZN9S10103C984v167Ev();
extern void _ZN9S10103C984v168Ev();
extern void _ZN9S10103C984v169Ev();
extern void _ZN9S10103C974v164Ev();
extern void _ZN9S10103C974v165Ev();
extern void _ZN9S10103C974v166Ev();
extern void ABISELECT(_ZThn48_N9S10103C97D1Ev,_ZThn32_N9S10103C97D1Ev)();
extern void ABISELECT(_ZThn48_N9S10103C97D0Ev,_ZThn32_N9S10103C97D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C97[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C97[0]),
  (VTBL_ENTRY)&_ZN9S10103C97D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C97D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C984v167Ev,
  (VTBL_ENTRY)&_ZN9S10103C984v168Ev,
  (VTBL_ENTRY)&_ZN9S10103C984v169Ev,
  (VTBL_ENTRY)&_ZN9S10103C974v164Ev,
  (VTBL_ENTRY)&_ZN9S10103C974v165Ev,
  (VTBL_ENTRY)&_ZN9S10103C974v166Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10103C97[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C97D1Ev,_ZThn32_N9S10103C97D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10103C97D0Ev,_ZThn32_N9S10103C97D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10103C97[];
extern  VTBL_ENTRY _ZTV9S10103C97[];
Class_Descriptor cd_S10103C97 = {  "S10103C97", // class name
  bases_S10103C97, 3,
  &(vtc_S10103C97[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(288,200), // object size
  NSPAIRA(_ZTI9S10103C97),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10103C97),38, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C100  : S10103C5_nt , S10103C12 {
  ::S10103C68 s10103c100f0;
  ::S10103C54_nt s10103c100f1;
  void *s10103c100f2;
  virtual  ~S10103C100(); // _ZN10S10103C100D1Ev
  virtual void  v173(); // _ZN10S10103C1004v173Ev
  virtual void  v174(); // _ZN10S10103C1004v174Ev
  virtual void  v175(); // _ZN10S10103C1004v175Ev
  virtual void  v176(); // _ZN10S10103C1004v176Ev
  virtual void  v177(); // _ZN10S10103C1004v177Ev
  virtual void  v178(); // _ZN10S10103C1004v178Ev
  virtual void  v179(); // _ZN10S10103C1004v179Ev
  virtual void  v180(); // _ZN10S10103C1004v180Ev
  S10103C100(); // tgen
};
//SIG(-1 S10103C100) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 v5 v6 v7 v8 FC11{ m Fp[2] FC12{ vd v33 v34 FC13{ m Fp Fi[2] FC14{ m}} FC15{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]} FC16{ m Fp} Fp}


 S10103C100 ::~S10103C100(){ note_dtor("S10103C100", this);}
void  S10103C100 ::v173(){vfunc_called(this, "_ZN10S10103C1004v173Ev");}
void  S10103C100 ::v174(){vfunc_called(this, "_ZN10S10103C1004v174Ev");}
void  S10103C100 ::v175(){vfunc_called(this, "_ZN10S10103C1004v175Ev");}
void  S10103C100 ::v176(){vfunc_called(this, "_ZN10S10103C1004v176Ev");}
void  S10103C100 ::v177(){vfunc_called(this, "_ZN10S10103C1004v177Ev");}
void  S10103C100 ::v178(){vfunc_called(this, "_ZN10S10103C1004v178Ev");}
void  S10103C100 ::v179(){vfunc_called(this, "_ZN10S10103C1004v179Ev");}
void  S10103C100 ::v180(){vfunc_called(this, "_ZN10S10103C1004v180Ev");}
S10103C100 ::S10103C100(){ note_ctor("S10103C100", this);} // tgen

static void Test_S10103C100()
{
  extern Class_Descriptor cd_S10103C100;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(41,56)];
    init_test(&cd_S10103C100, buf);
    S10103C100 *dp, &lv = *(dp=new (buf) S10103C100());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(320,220), "sizeof(S10103C100)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C100)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10103C100");
    check_base_class_offset(lv, (S10103C12*), ABISELECT(48,32), "S10103C100");
    check_field_offset(lv, s10103c100f0, ABISELECT(168,112), "S10103C100.s10103c100f0");
    check_field_offset(lv, s10103c100f1, ABISELECT(304,212), "S10103C100.s10103c100f1");
    check_field_offset(lv, s10103c100f2, ABISELECT(312,216), "S10103C100.s10103c100f2");
    test_class_info(&lv, &cd_S10103C100);
    dp->~S10103C100();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C100(Test_S10103C100, "S10103C100", ABISELECT(320,220));

#else // __cplusplus

extern void _ZN10S10103C100C1Ev();
extern void _ZN10S10103C100D1Ev();
Name_Map name_map_S10103C100[] = {
  NSPAIR(_ZN10S10103C100C1Ev),
  NSPAIR(_ZN10S10103C100D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C100[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S10103C100[];
extern void _ZN10S10103C100D1Ev();
extern void _ZN10S10103C100D0Ev();
extern void _ZN10S10103C1004v173Ev();
extern void _ZN10S10103C1004v174Ev();
extern void _ZN10S10103C1004v175Ev();
extern void _ZN10S10103C1004v176Ev();
extern void _ZN10S10103C1004v177Ev();
extern void _ZN10S10103C1004v178Ev();
extern void _ZN10S10103C1004v179Ev();
extern void _ZN10S10103C1004v180Ev();
extern void ABISELECT(_ZThn48_N10S10103C100D1Ev,_ZThn32_N10S10103C100D1Ev)();
extern void ABISELECT(_ZThn48_N10S10103C100D0Ev,_ZThn32_N10S10103C100D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
static  VTBL_ENTRY vtc_S10103C100[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S10103C100[0]),
  (VTBL_ENTRY)&_ZN10S10103C100D1Ev,
  (VTBL_ENTRY)&_ZN10S10103C100D0Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v173Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v174Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v175Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v176Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v177Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v178Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v179Ev,
  (VTBL_ENTRY)&_ZN10S10103C1004v180Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI10S10103C100[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N10S10103C100D1Ev,_ZThn32_N10S10103C100D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N10S10103C100D0Ev,_ZThn32_N10S10103C100D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
};
extern VTBL_ENTRY _ZTI10S10103C100[];
extern  VTBL_ENTRY _ZTV10S10103C100[];
Class_Descriptor cd_S10103C100 = {  "S10103C100", // class name
  bases_S10103C100, 2,
  &(vtc_S10103C100[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(320,220), // object size
  NSPAIRA(_ZTI10S10103C100),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV10S10103C100),40, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C101  : S10103C28 , S10103C2_nt {
  int s10103c101f0;
  void *s10103c101f1;
  int s10103c101f2;
  ::S10103C29 s10103c101f3;
  virtual  ~S10103C101(); // _ZN10S10103C101D1Ev
  virtual void  v181(); // _ZN10S10103C1014v181Ev
  virtual void  v182(); // _ZN10S10103C1014v182Ev
  virtual void  v183(); // _ZN10S10103C1014v183Ev
  virtual void  v184(); // _ZN10S10103C1014v184Ev
  virtual void  v185(); // _ZN10S10103C1014v185Ev
  virtual void  v186(); // _ZN10S10103C1014v186Ev
  S10103C101(); // tgen
};
//SIG(-1 S10103C101) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v31 v32 v33 v34 v35 v36 v37 v38 v39} BC12{ vd v40} vd v1 v2 v3 v4 v5 v6 Fi Fp Fi FC13{ m Fi Fp Fi Fp[2] Fi}}


 S10103C101 ::~S10103C101(){ note_dtor("S10103C101", this);}
void  S10103C101 ::v181(){vfunc_called(this, "_ZN10S10103C1014v181Ev");}
void  S10103C101 ::v182(){vfunc_called(this, "_ZN10S10103C1014v182Ev");}
void  S10103C101 ::v183(){vfunc_called(this, "_ZN10S10103C1014v183Ev");}
void  S10103C101 ::v184(){vfunc_called(this, "_ZN10S10103C1014v184Ev");}
void  S10103C101 ::v185(){vfunc_called(this, "_ZN10S10103C1014v185Ev");}
void  S10103C101 ::v186(){vfunc_called(this, "_ZN10S10103C1014v186Ev");}
S10103C101 ::S10103C101(){ note_ctor("S10103C101", this);} // tgen

static void Test_S10103C101()
{
  extern Class_Descriptor cd_S10103C101;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(32,39)];
    init_test(&cd_S10103C101, buf);
    S10103C101 *dp, &lv = *(dp=new (buf) S10103C101());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(248,152), "sizeof(S10103C101)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C101)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10103C28*), 0, "S10103C101");
    check_base_class_offset(lv, (S10103C12*)(S10103C28*), ABISELECT(48,32), "S10103C101");
    check_base_class_offset(lv, (S10103C28*), 0, "S10103C101");
    check_base_class_offset(lv, (S10103C2_nt*), ABISELECT(168,112), "S10103C101");
    check_field_offset(lv, s10103c101f0, ABISELECT(176,116), "S10103C101.s10103c101f0");
    check_field_offset(lv, s10103c101f1, ABISELECT(184,120), "S10103C101.s10103c101f1");
    check_field_offset(lv, s10103c101f2, ABISELECT(192,124), "S10103C101.s10103c101f2");
    check_field_offset(lv, s10103c101f3, ABISELECT(200,128), "S10103C101.s10103c101f3");
    test_class_info(&lv, &cd_S10103C101);
    dp->~S10103C101();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C101(Test_S10103C101, "S10103C101", ABISELECT(248,152));

#else // __cplusplus

extern void _ZN10S10103C101C1Ev();
extern void _ZN10S10103C101D1Ev();
Name_Map name_map_S10103C101[] = {
  NSPAIR(_ZN10S10103C101C1Ev),
  NSPAIR(_ZN10S10103C101D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
extern Class_Descriptor cd_S10103C28;
extern VTBL_ENTRY _ZTI9S10103C28[];
extern  VTBL_ENTRY _ZTV9S10103C28[];
extern Class_Descriptor cd_S10103C2_nt;
extern VTBL_ENTRY _ZTI11S10103C2_nt[];
extern  VTBL_ENTRY _ZTV11S10103C2_nt[];
static Base_Class bases_S10103C101[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C12,    ABISELECT(48,32), //bcp->offset
    19, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10103C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C2_nt,    ABISELECT(168,112), //bcp->offset
    47, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S10103C101[];
extern void _ZN10S10103C101D1Ev();
extern void _ZN10S10103C101D0Ev();
extern void _ZN9S10103C283v47Ev();
extern void _ZN9S10103C283v48Ev();
extern void _ZN9S10103C283v49Ev();
extern void _ZN9S10103C283v50Ev();
extern void _ZN9S10103C283v51Ev();
extern void _ZN9S10103C283v52Ev();
extern void _ZN9S10103C283v53Ev();
extern void _ZN9S10103C283v54Ev();
extern void _ZN9S10103C283v55Ev();
extern void _ZN10S10103C1014v181Ev();
extern void _ZN10S10103C1014v182Ev();
extern void _ZN10S10103C1014v183Ev();
extern void _ZN10S10103C1014v184Ev();
extern void _ZN10S10103C1014v185Ev();
extern void _ZN10S10103C1014v186Ev();
extern void ABISELECT(_ZThn48_N10S10103C101D1Ev,_ZThn32_N10S10103C101D1Ev)();
extern void ABISELECT(_ZThn48_N10S10103C101D0Ev,_ZThn32_N10S10103C101D0Ev)();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
extern void ABISELECT(_ZThn168_N10S10103C101D1Ev,_ZThn112_N10S10103C101D1Ev)();
extern void ABISELECT(_ZThn168_N10S10103C101D0Ev,_ZThn112_N10S10103C101D0Ev)();
extern void _ZN11S10103C2_nt2v6Ev();
static  VTBL_ENTRY vtc_S10103C101[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S10103C101[0]),
  (VTBL_ENTRY)&_ZN10S10103C101D1Ev,
  (VTBL_ENTRY)&_ZN10S10103C101D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v47Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v48Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v49Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v50Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v51Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v52Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v53Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v54Ev,
  (VTBL_ENTRY)&_ZN9S10103C283v55Ev,
  (VTBL_ENTRY)&_ZN10S10103C1014v181Ev,
  (VTBL_ENTRY)&_ZN10S10103C1014v182Ev,
  (VTBL_ENTRY)&_ZN10S10103C1014v183Ev,
  (VTBL_ENTRY)&_ZN10S10103C1014v184Ev,
  (VTBL_ENTRY)&_ZN10S10103C1014v185Ev,
  (VTBL_ENTRY)&_ZN10S10103C1014v186Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI10S10103C101[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N10S10103C101D1Ev,_ZThn32_N10S10103C101D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N10S10103C101D0Ev,_ZThn32_N10S10103C101D0Ev),
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
  ABISELECT(-168,-112),
  (VTBL_ENTRY)&(_ZTI10S10103C101[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn168_N10S10103C101D1Ev,_ZThn112_N10S10103C101D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn168_N10S10103C101D0Ev,_ZThn112_N10S10103C101D0Ev),
  (VTBL_ENTRY)&_ZN11S10103C2_nt2v6Ev,
};
extern VTBL_ENTRY _ZTI10S10103C101[];
extern  VTBL_ENTRY _ZTV10S10103C101[];
Class_Descriptor cd_S10103C101 = {  "S10103C101", // class name
  bases_S10103C101, 4,
  &(vtc_S10103C101[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(248,152), // object size
  NSPAIRA(_ZTI10S10103C101),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV10S10103C101),52, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C102  : S10103C12 {
  virtual  ~S10103C102(); // _ZN10S10103C102D1Ev
  virtual void  v187(); // _ZN10S10103C1024v187Ev
  virtual void  v188(); // _ZN10S10103C1024v188Ev
  virtual void  v189(); // _ZN10S10103C1024v189Ev
  virtual void  v190(); // _ZN10S10103C1024v190Ev
  S10103C102(); // tgen
};
//SIG(-1 S10103C102) C1{ BC2{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 Fp FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} FC6{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC7{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4}


 S10103C102 ::~S10103C102(){ note_dtor("S10103C102", this);}
void  S10103C102 ::v187(){vfunc_called(this, "_ZN10S10103C1024v187Ev");}
void  S10103C102 ::v188(){vfunc_called(this, "_ZN10S10103C1024v188Ev");}
void  S10103C102 ::v189(){vfunc_called(this, "_ZN10S10103C1024v189Ev");}
void  S10103C102 ::v190(){vfunc_called(this, "_ZN10S10103C1024v190Ev");}
S10103C102 ::S10103C102(){ note_ctor("S10103C102", this);} // tgen

static void Test_S10103C102()
{
  extern Class_Descriptor cd_S10103C102;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S10103C102, buf);
    S10103C102 *dp, &lv = *(dp=new (buf) S10103C102());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S10103C102)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C102)");
    check_base_class_offset(lv, (S10103C12*), 0, "S10103C102");
    test_class_info(&lv, &cd_S10103C102);
    dp->~S10103C102();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C102(Test_S10103C102, "S10103C102", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN10S10103C102C1Ev();
extern void _ZN10S10103C102D1Ev();
Name_Map name_map_S10103C102[] = {
  NSPAIR(_ZN10S10103C102C1Ev),
  NSPAIR(_ZN10S10103C102D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C12;
extern VTBL_ENTRY _ZTI9S10103C12[];
extern  VTBL_ENTRY _ZTV9S10103C12[];
static Base_Class bases_S10103C102[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S10103C102[];
extern void _ZN10S10103C102D1Ev();
extern void _ZN10S10103C102D0Ev();
extern void _ZN9S10103C123v14Ev();
extern void _ZN9S10103C123v15Ev();
extern void _ZN9S10103C123v16Ev();
extern void _ZN9S10103C123v17Ev();
extern void _ZN9S10103C123v18Ev();
extern void _ZN9S10103C123v19Ev();
extern void _ZN9S10103C123v20Ev();
extern void _ZN9S10103C123v21Ev();
extern void _ZN9S10103C123v22Ev();
extern void _ZN9S10103C123v23Ev();
extern void _ZN9S10103C123v24Ev();
extern void _ZN9S10103C123v25Ev();
extern void _ZN9S10103C123v26Ev();
extern void _ZN9S10103C123v27Ev();
extern void _ZN9S10103C123v28Ev();
extern void _ZN9S10103C123v29Ev();
extern void _ZN9S10103C123v30Ev();
extern void _ZN9S10103C123v31Ev();
extern void _ZN9S10103C123v32Ev();
extern void _ZN9S10103C123v33Ev();
extern void _ZN9S10103C123v34Ev();
extern void _ZN9S10103C123v35Ev();
extern void _ZN9S10103C123v36Ev();
extern void _ZN9S10103C123v37Ev();
extern void _ZN10S10103C1024v187Ev();
extern void _ZN10S10103C1024v188Ev();
extern void _ZN10S10103C1024v189Ev();
extern void _ZN10S10103C1024v190Ev();
static  VTBL_ENTRY vtc_S10103C102[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S10103C102[0]),
  (VTBL_ENTRY)&_ZN10S10103C102D1Ev,
  (VTBL_ENTRY)&_ZN10S10103C102D0Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10103C123v37Ev,
  (VTBL_ENTRY)&_ZN10S10103C1024v187Ev,
  (VTBL_ENTRY)&_ZN10S10103C1024v188Ev,
  (VTBL_ENTRY)&_ZN10S10103C1024v189Ev,
  (VTBL_ENTRY)&_ZN10S10103C1024v190Ev,
};
extern VTBL_ENTRY _ZTI10S10103C102[];
extern  VTBL_ENTRY _ZTV10S10103C102[];
Class_Descriptor cd_S10103C102 = {  "S10103C102", // class name
  bases_S10103C102, 1,
  &(vtc_S10103C102[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI10S10103C102),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV10S10103C102),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C61  : S10103C2_nt , S10103C3_nt {
  void *s10103c61f0;
  ::S10103C62 s10103c61f1;
  ::S10103C47 s10103c61f2;
  ::S10103C40 s10103c61f3;
  ::S10103C97 s10103c61f4;
  ::S10103C97 s10103c61f5;
  ::S10103C100 s10103c61f6;
  ::S10103C101 s10103c61f7;
  ::S10103C102 s10103c61f8;
  ::S10103C96 s10103c61f9;
  ::S10103C56 s10103c61f10;
  ::S10103C56 s10103c61f11;
  void *s10103c61f12;
  virtual  ~S10103C61(); // _ZN9S10103C61D1Ev
  virtual void  v94(); // _ZN9S10103C613v94Ev
  virtual void  v95(); // _ZN9S10103C613v95Ev
  virtual void  v96(); // _ZN9S10103C613v96Ev
  virtual void  v97(); // _ZN9S10103C613v97Ev
  virtual void  v98(); // _ZN9S10103C613v98Ev
  S10103C61(); // tgen
};
//SIG(-1 S10103C61) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 Fp FC4{ BC5{ vd m FC6{ m Fp Fi FC7{ m} FC7} FC6 Fc} BC8{ vd v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 v47 v48 Fp FC9{ m FC10{ m Fp Fi FC11{ m}} Fi} FC12{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC13{ m Fc Fi[2] Fp}} vd v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 FC14{ m Fp} FC15{ m Fp} FC15 Fi[2] FC16{ BC17{ vd v49 v50} FC10 Fi FL[2] Fi} Fp FC18{ m Fp[2] FC19{ vd v51 v52 FC20{ m Fp Fi[2] FC21{ m}} FC22{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]} Fc FC23{ BC24{ BC25{ BC26{ vd v57 v58 v59 v60 v61 v62 v63 v64 v65 v66 Fp[2] FC9 Fp} vd v67 v68 v69 v70 v71 v72 v73 v74 v75 v76 v77 v78 v79 v80 FC27{ m Fp Fi FC28{ m} FC28} FC20 FC29{ m FC30{ m FL[2]}} FC9} v81 v82 v83 v84 FC31{ BC32{ BC26 vd v89 v90 v91 v92 v93 v94 Fp Fi FC33{ m Fp Fi FC21 FC34{ m}} FC29 Fi} vd v85 v86 v87 v88 FC9[4] FC29 FC29 FC29 FC29 Fi[6]} FC29 FC29} v53 v54 v55 v56 FC35{ m FC36{ m FL}} FC29} FC37{ BC26 vd v95 v96 v97 v98 v99 v100 Fp[2] FC29 FC29 FC29 Fi[13] Fp[3] Fi[3]} FC38{ Fi[4]}[2] FC38[2] FC29 FC39{ vd m Fp[2] FC33 FC40{ vd m FL[2] Fi FC10 FC10 FC10 FC10 FC14}} FC9 Fp[2] FC9 Fp[3] Fc} FC41{ BC42{ BC5 vd v102 v103 v104 v105 FC43{ m Fp FC9 FC10 FC10 Fi} Fp Fc Fi} v101} FC44{ BC42 v106 v107} FC45{ BC46{ BC5 BC8 vd v111 v112 v113 FC40 FL Fi} vd v108 v109 v110} FC45 FC47{ BC5 BC8 vd v114 v115 v116 v117 v118 v119 v120 v121 FC18 FC14 Fp} FC48{ BC49{ BC5 BC8 vd v128 v129 v130 v131 v132 v133 v134 v135 v136} BC2 vd v122 v123 v124 v125 v126 v127 Fi Fp Fi FC50{ m Fi Fp Fi Fp[2] Fi}} FC51{ BC8 vd v137 v138 v139 v140} FC40 FC52{ BC42 v141} FC52 Fp}


 S10103C61 ::~S10103C61(){ note_dtor("S10103C61", this);}
void  S10103C61 ::v94(){vfunc_called(this, "_ZN9S10103C613v94Ev");}
void  S10103C61 ::v95(){vfunc_called(this, "_ZN9S10103C613v95Ev");}
void  S10103C61 ::v96(){vfunc_called(this, "_ZN9S10103C613v96Ev");}
void  S10103C61 ::v97(){vfunc_called(this, "_ZN9S10103C613v97Ev");}
void  S10103C61 ::v98(){vfunc_called(this, "_ZN9S10103C613v98Ev");}
S10103C61 ::S10103C61(){ note_ctor("S10103C61", this);} // tgen

static void Test_S10103C61()
{
  extern Class_Descriptor cd_S10103C61;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(424,593)];
    init_test(&cd_S10103C61, buf);
    S10103C61 *dp, &lv = *(dp=new (buf) S10103C61());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(3384,2368), "sizeof(S10103C61)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C61)");
    check_base_class_offset(lv, (S10103C2_nt*), 0, "S10103C61");
    check_base_class_offset(lv, (S10103C3_nt*), ABISELECT(8,4), "S10103C61");
    check_field_offset(lv, s10103c61f0, ABISELECT(24,12), "S10103C61.s10103c61f0");
    check_field_offset(lv, s10103c61f1, ABISELECT(32,16), "S10103C61.s10103c61f1");
    check_field_offset(lv, s10103c61f2, ABISELECT(1464,1068), "S10103C61.s10103c61f2");
    check_field_offset(lv, s10103c61f3, ABISELECT(1600,1160), "S10103C61.s10103c61f3");
    check_field_offset(lv, s10103c61f4, ABISELECT(1736,1252), "S10103C61.s10103c61f4");
    check_field_offset(lv, s10103c61f5, ABISELECT(2024,1452), "S10103C61.s10103c61f5");
    check_field_offset(lv, s10103c61f6, ABISELECT(2312,1652), "S10103C61.s10103c61f6");
    check_field_offset(lv, s10103c61f7, ABISELECT(2632,1872), "S10103C61.s10103c61f7");
    check_field_offset(lv, s10103c61f8, ABISELECT(2880,2024), "S10103C61.s10103c61f8");
    check_field_offset(lv, s10103c61f9, ABISELECT(3000,2104), "S10103C61.s10103c61f9");
    check_field_offset(lv, s10103c61f10, ABISELECT(3104,2180), "S10103C61.s10103c61f10");
    check_field_offset(lv, s10103c61f11, ABISELECT(3240,2272), "S10103C61.s10103c61f11");
    check_field_offset(lv, s10103c61f12, ABISELECT(3376,2364), "S10103C61.s10103c61f12");
    test_class_info(&lv, &cd_S10103C61);
    dp->~S10103C61();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C61(Test_S10103C61, "S10103C61", ABISELECT(3384,2368));

#else // __cplusplus

extern void _ZN9S10103C61C1Ev();
extern void _ZN9S10103C61D1Ev();
Name_Map name_map_S10103C61[] = {
  NSPAIR(_ZN9S10103C61C1Ev),
  NSPAIR(_ZN9S10103C61D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C2_nt;
extern VTBL_ENTRY _ZTI11S10103C2_nt[];
extern  VTBL_ENTRY _ZTV11S10103C2_nt[];
extern Class_Descriptor cd_S10103C3_nt;
extern VTBL_ENTRY _ZTI11S10103C3_nt[];
extern  VTBL_ENTRY _ZTV11S10103C3_nt[];
static Base_Class bases_S10103C61[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C3_nt,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10103C61[];
extern void _ZN9S10103C61D1Ev();
extern void _ZN9S10103C61D0Ev();
extern void _ZN11S10103C2_nt2v6Ev();
extern void _ZN9S10103C613v94Ev();
extern void _ZN9S10103C613v95Ev();
extern void _ZN9S10103C613v96Ev();
extern void _ZN9S10103C613v97Ev();
extern void _ZN9S10103C613v98Ev();
extern void ABISELECT(_ZThn8_N9S10103C61D1Ev,_ZThn4_N9S10103C61D1Ev)();
extern void ABISELECT(_ZThn8_N9S10103C61D0Ev,_ZThn4_N9S10103C61D0Ev)();
extern void _ZN11S10103C3_nt2v7Ev();
extern void _ZN11S10103C3_nt2v8Ev();
extern void _ZN11S10103C3_nt2v9Ev();
extern void _ZN11S10103C3_nt3v10Ev();
extern void _ZN11S10103C3_nt3v11Ev();
static  VTBL_ENTRY vtc_S10103C61[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10103C61[0]),
  (VTBL_ENTRY)&_ZN9S10103C61D1Ev,
  (VTBL_ENTRY)&_ZN9S10103C61D0Ev,
  (VTBL_ENTRY)&_ZN11S10103C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN9S10103C613v94Ev,
  (VTBL_ENTRY)&_ZN9S10103C613v95Ev,
  (VTBL_ENTRY)&_ZN9S10103C613v96Ev,
  (VTBL_ENTRY)&_ZN9S10103C613v97Ev,
  (VTBL_ENTRY)&_ZN9S10103C613v98Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI9S10103C61[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N9S10103C61D1Ev,_ZThn4_N9S10103C61D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N9S10103C61D0Ev,_ZThn4_N9S10103C61D0Ev),
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v7Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v8Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v9Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v10Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v11Ev,
};
extern VTBL_ENTRY _ZTI9S10103C61[];
extern  VTBL_ENTRY _ZTV9S10103C61[];
Class_Descriptor cd_S10103C61 = {  "S10103C61", // class name
  bases_S10103C61, 2,
  &(vtc_S10103C61[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(3384,2368), // object size
  NSPAIRA(_ZTI9S10103C61),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10103C61),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C105  {
  void *s10103c105f0;
  void  mf10103c105(); // _ZN10S10103C10511mf10103c105Ev
};
//SIG(-1 S10103C105) C1{ m Fp}


void  S10103C105 ::mf10103c105(){}

static void Test_S10103C105()
{
  {
    init_simple_test("S10103C105");
    S10103C105 lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10103C105)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C105)");
    check_field_offset(lv, s10103c105f0, 0, "S10103C105.s10103c105f0");
  }
}
static Arrange_To_Call_Me vS10103C105(Test_S10103C105, "S10103C105", ABISELECT(8,4));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C106  {
  void *s10103c106f0;
  int s10103c106f1[2];
  ::S10103C88 s10103c106f2;
  void  mf10103c106(); // _ZN10S10103C10611mf10103c106Ev
};
//SIG(-1 S10103C106) C1{ m Fp Fi[2] FC2{ m}}


void  S10103C106 ::mf10103c106(){}

static void Test_S10103C106()
{
  {
    init_simple_test("S10103C106");
    S10103C106 lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S10103C106)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C106)");
    check_field_offset(lv, s10103c106f0, 0, "S10103C106.s10103c106f0");
    check_field_offset(lv, s10103c106f1, ABISELECT(8,4), "S10103C106.s10103c106f1");
    check_field_offset(lv, s10103c106f2, ABISELECT(16,12), "S10103C106.s10103c106f2");
  }
}
static Arrange_To_Call_Me vS10103C106(Test_S10103C106, "S10103C106", ABISELECT(24,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C104  {
  char s10103c104f0;
  ::S10103C105 s10103c104f1;
  ::S10103C106 s10103c104f2;
  void  mf10103c104(); // _ZN10S10103C10411mf10103c104Ev
  virtual  ~S10103C104(); // _ZN10S10103C104D1Ev
  S10103C104(); // tgen
};
//SIG(-1 S10103C104) C1{ vd m Fc FC2{ m Fp} FC3{ m Fp Fi[2] FC4{ m}}}


void  S10103C104 ::mf10103c104(){}
 S10103C104 ::~S10103C104(){ note_dtor("S10103C104", this);}
S10103C104 ::S10103C104(){ note_ctor("S10103C104", this);} // tgen

static void Test_S10103C104()
{
  extern Class_Descriptor cd_S10103C104;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_S10103C104, buf);
    S10103C104 *dp, &lv = *(dp=new (buf) S10103C104());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(S10103C104)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C104)");
    check_field_offset(lv, s10103c104f0, ABISELECT(8,4), "S10103C104.s10103c104f0");
    check_field_offset(lv, s10103c104f1, ABISELECT(16,8), "S10103C104.s10103c104f1");
    check_field_offset(lv, s10103c104f2, ABISELECT(24,12), "S10103C104.s10103c104f2");
    test_class_info(&lv, &cd_S10103C104);
    dp->~S10103C104();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C104(Test_S10103C104, "S10103C104", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN10S10103C104C1Ev();
extern void _ZN10S10103C104D1Ev();
Name_Map name_map_S10103C104[] = {
  NSPAIR(_ZN10S10103C104C1Ev),
  NSPAIR(_ZN10S10103C104D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S10103C104[];
extern void _ZN10S10103C104D1Ev();
extern void _ZN10S10103C104D0Ev();
static  VTBL_ENTRY vtc_S10103C104[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S10103C104[0]),
  (VTBL_ENTRY)&_ZN10S10103C104D1Ev,
  (VTBL_ENTRY)&_ZN10S10103C104D0Ev,
};
extern VTBL_ENTRY _ZTI10S10103C104[];
extern  VTBL_ENTRY _ZTV10S10103C104[];
Class_Descriptor cd_S10103C104 = {  "S10103C104", // class name
  0,0,//no base classes
  &(vtc_S10103C104[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI10S10103C104),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV10S10103C104),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C109_nt  {
};
//SIG(-1 S10103C109_nt) C1{}



//skip512 S10103C109_nt

#else // __cplusplus

extern VTBL_ENTRY _ZTI13S10103C109_nt[];
VTBL_ENTRY *P__ZTI13S10103C109_nt = _ZTI13S10103C109_nt; 
Class_Descriptor cd_S10103C109_nt = {  "S10103C109_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  1, // object size
  NSPAIRA(_ZTI13S10103C109_nt),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C108  : S10103C109_nt {
  void *s10103c108f0[2];
  ::S10103C14_nt s10103c108f1;
  ::S10103C14_nt s10103c108f2;
  ::S10103C14_nt s10103c108f3;
  ::S10103C14_nt s10103c108f4;
  ::S10103C14_nt s10103c108f5;
  __tsi64 s10103c108f6;
  int s10103c108f7;
  ::S10103C30_nt s10103c108f8;
  ::S10103C30_nt s10103c108f9;
  int s10103c108f10[2];
  ::S10103C54_nt s10103c108f11;
  int s10103c108f12;
  char s10103c108f13;
  int s10103c108f14;
  unsigned char s10103c108f15:1;
  unsigned char s10103c108f16:1;
  unsigned char s10103c108f17:1;
  unsigned char s10103c108f18:1;
  unsigned char s10103c108f19:1;
  unsigned char s10103c108f20:1;
  unsigned char s10103c108f21:1;
  unsigned char s10103c108f22:1;
  unsigned char s10103c108f23:1;
  unsigned char s10103c108f24:1;
  unsigned char s10103c108f25:1;
  unsigned char s10103c108f26:1;
  unsigned char s10103c108f27:1;
  unsigned char s10103c108f28:1;
  unsigned char s10103c108f29:1;
  virtual  ~S10103C108(); // _ZN10S10103C108D1Ev
  S10103C108(); // tgen
};
//SIG(-1 S10103C108) C1{ BC2{} vd Fp[2] FC3{ m Fp Fi FC4{ m}} FC3 FC3 FC3 FC3 FL Fi FC5{ m FC6{ m FL}} FC5 Fi[2] FC7{ m Fp} Fi Fc Fi Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1}


 S10103C108 ::~S10103C108(){ note_dtor("S10103C108", this);}
S10103C108 ::S10103C108(){ note_ctor("S10103C108", this);} // tgen

static void Test_S10103C108()
{
  extern Class_Descriptor cd_S10103C108;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(22,33)];
    init_test(&cd_S10103C108, buf);
    S10103C108 *dp, &lv = *(dp=new (buf) S10103C108());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(168,128), "sizeof(S10103C108)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C108)");
    check_base_class_offset(lv, (S10103C109_nt*), 0, "S10103C108");
    check_field_offset(lv, s10103c108f0, ABISELECT(8,4), "S10103C108.s10103c108f0");
    check_field_offset(lv, s10103c108f1, ABISELECT(24,12), "S10103C108.s10103c108f1");
    check_field_offset(lv, s10103c108f2, ABISELECT(40,24), "S10103C108.s10103c108f2");
    check_field_offset(lv, s10103c108f3, ABISELECT(56,36), "S10103C108.s10103c108f3");
    check_field_offset(lv, s10103c108f4, ABISELECT(72,48), "S10103C108.s10103c108f4");
    check_field_offset(lv, s10103c108f5, ABISELECT(88,60), "S10103C108.s10103c108f5");
    check_field_offset(lv, s10103c108f6, ABISELECT(104,72), "S10103C108.s10103c108f6");
    check_field_offset(lv, s10103c108f7, ABISELECT(112,80), "S10103C108.s10103c108f7");
    check_field_offset(lv, s10103c108f8, ABISELECT(120,84), "S10103C108.s10103c108f8");
    check_field_offset(lv, s10103c108f9, ABISELECT(128,92), "S10103C108.s10103c108f9");
    check_field_offset(lv, s10103c108f10, ABISELECT(136,100), "S10103C108.s10103c108f10");
    check_field_offset(lv, s10103c108f11, ABISELECT(144,108), "S10103C108.s10103c108f11");
    check_field_offset(lv, s10103c108f12, ABISELECT(152,112), "S10103C108.s10103c108f12");
    check_field_offset(lv, s10103c108f13, ABISELECT(156,116), "S10103C108.s10103c108f13");
    check_field_offset(lv, s10103c108f14, ABISELECT(160,120), "S10103C108.s10103c108f14");
    set_bf_and_test(lv, s10103c108f15, ABISELECT(164,124), 0, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f16, ABISELECT(164,124), 1, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f17, ABISELECT(164,124), 2, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f18, ABISELECT(164,124), 3, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f19, ABISELECT(164,124), 4, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f20, ABISELECT(164,124), 5, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f21, ABISELECT(164,124), 6, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f22, ABISELECT(164,124), 7, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f23, ABISELECT(165,125), 0, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f24, ABISELECT(165,125), 1, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f25, ABISELECT(165,125), 2, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f26, ABISELECT(165,125), 3, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f27, ABISELECT(165,125), 4, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f28, ABISELECT(165,125), 5, 1, 1, "S10103C108");
    set_bf_and_test(lv, s10103c108f29, ABISELECT(165,125), 6, 1, 1, "S10103C108");
    test_class_info(&lv, &cd_S10103C108);
    dp->~S10103C108();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C108(Test_S10103C108, "S10103C108", ABISELECT(168,128));

#else // __cplusplus

extern void _ZN10S10103C108C1Ev();
extern void _ZN10S10103C108D1Ev();
Name_Map name_map_S10103C108[] = {
  NSPAIR(_ZN10S10103C108C1Ev),
  NSPAIR(_ZN10S10103C108D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C109_nt;
extern VTBL_ENTRY _ZTI13S10103C109_nt[];
static Base_Class bases_S10103C108[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C109_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S10103C108[];
extern void _ZN10S10103C108D1Ev();
extern void _ZN10S10103C108D0Ev();
static  VTBL_ENTRY vtc_S10103C108[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S10103C108[0]),
  (VTBL_ENTRY)&_ZN10S10103C108D1Ev,
  (VTBL_ENTRY)&_ZN10S10103C108D0Ev,
};
extern VTBL_ENTRY _ZTI10S10103C108[];
extern  VTBL_ENTRY _ZTV10S10103C108[];
Class_Descriptor cd_S10103C108 = {  "S10103C108", // class name
  bases_S10103C108, 1,
  &(vtc_S10103C108[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(168,128), // object size
  NSPAIRA(_ZTI10S10103C108),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV10S10103C108),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C110  : S10103C109_nt {
  ::S10103C14_nt s10103c110f0;
  ::S10103C14_nt s10103c110f1;
};
//SIG(-1 S10103C110) C1{ BC2{} FC3{ m Fp Fi FC4{ m}} FC3}



static void Test_S10103C110()
{
  extern Class_Descriptor cd_S10103C110;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_S10103C110, buf);
    S10103C110 &lv = *(new (buf) S10103C110());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(S10103C110)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C110)");
    check_base_class_offset(lv, (S10103C109_nt*), 0, "S10103C110");
    check_field_offset(lv, s10103c110f0, 0, "S10103C110.s10103c110f0");
    check_field_offset(lv, s10103c110f1, ABISELECT(16,12), "S10103C110.s10103c110f1");
    test_class_info(&lv, &cd_S10103C110);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C110(Test_S10103C110, "S10103C110", ABISELECT(32,24));

#else // __cplusplus

extern Class_Descriptor cd_S10103C109_nt;
extern VTBL_ENTRY _ZTI13S10103C109_nt[];
static Base_Class bases_S10103C110[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C109_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S10103C110 = {  "S10103C110", // class name
  bases_S10103C110, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(32,24), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C111_nt  {
  void *s10103c111f0[2];
  void  mf10103c111(); // _ZN13S10103C111_nt11mf10103c111Ev
};
//SIG(-1 S10103C111_nt) C1{ m Fp[2]}


void  S10103C111_nt ::mf10103c111(){}

//skip512 S10103C111_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10103C1  : S10103C2_nt , S10103C3_nt {
  ::S10103C4 s10103c1f0;
  void *s10103c1f1[2];
  ::S10103C24 s10103c1f2;
  ::S10103C26 s10103c1f3;
  ::S10103C27 s10103c1f4;
  ::S10103C32 s10103c1f5;
  ::S10103C33 s10103c1f6;
  ::S10103C34 s10103c1f7;
  ::S10103C38 s10103c1f8;
  ::S10103C39 s10103c1f9;
  ::S10103C40 s10103c1f10;
  ::S10103C45 s10103c1f11;
  ::S10103C45 s10103c1f12;
  ::S10103C40 s10103c1f13;
  ::S10103C47 s10103c1f14;
  ::S10103C47 s10103c1f15;
  ::S10103C47 s10103c1f16;
  ::S10103C47 s10103c1f17;
  ::S10103C47 s10103c1f18;
  ::S10103C49 s10103c1f19;
  ::S10103C50 s10103c1f20;
  ::S10103C51 s10103c1f21;
  ::S10103C52 s10103c1f22;
  ::S10103C53 s10103c1f23;
  ::S10103C55 s10103c1f24;
  ::S10103C61 s10103c1f25;
  ::S10103C104 s10103c1f26;
  ::S10103C58_nt s10103c1f27;
  int s10103c1f28;
  char s10103c1f29[2];
  void *s10103c1f30;
  ::S10103C108 s10103c1f31;
  ::S10103C110 s10103c1f32;
  void *s10103c1f33[3];
  char s10103c1f34;
  ::S10103C111_nt s10103c1f35;
  void *s10103c1f36;
  virtual  ~S10103C1(); // _ZN8S10103C1D1Ev
  virtual void  v1(); // _ZN8S10103C12v1Ev
  virtual void  v2(); // _ZN8S10103C12v2Ev
  virtual void  v3(); // _ZN8S10103C12v3Ev
  virtual void  v4(); // _ZN8S10103C12v4Ev
  virtual void  v5(); // _ZN8S10103C12v5Ev
  S10103C1(); // tgen
};
//SIG(1 S10103C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 FC4{ BC5{ vd m FC6{ m Fp Fi FC7{ m} FC7} FC6 Fc} BC8{ vd v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 Fp FC9{ m FC10{ m Fp Fi FC11{ m}} Fi} FC12{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC13{ m Fc Fi[2] Fp}} vd v12 v13 Fi Fp[8] Fi[2] FC14{ Fi[11]} Fi[4] Fc FC15{ vd m Fi FC16{ m Fp Fi[2] FC11} FC17{ m FC18{ FL[4]}}} Fp} Fp[2] FC19{ BC5 BC8 vd v38 v39 FC20{ Fi[4]}[2] FC20[2] FC20[2] FC20[2]} FC21{ BC5 BC8 vd v40 v41 v42 v43 Fp[2] Fc FC20[2] FC20[2] FC20[2] FC20[2]} FC22{ BC23{ BC5 BC8 vd v47 v48 v49 v50 v51 v52 v53 v54 v55} vd v44 v45 v46 Fi[2] FC24{ m Fi Fp Fi Fp[2] Fi} FC10 FC10 FC10 FC10 FC25{ m FC26{ m FL}} FL Fi Fp Fi Fc} FC27{ BC23 vd v56 v57 v58 FC24 FC10 FC10 Fp Fi} FC28{ BC5 BC8 vd v59 v60 v61 Fp} FC29{ BC5 BC8 vd v62 v63 Fp FC30{ m Fp Fi FC31{ m} FC31} FC10 FC10 Fi[2] Fc Fi[2]} FC32{ BC5 vd Fc Fp[2]} FC33{ BC5 BC8 vd v64 v65 v66 v67 v68 Fc} FC34{ BC35{ BC5 vd v71 v72 v73 v74 FC36{ m Fp FC9 FC10 FC10 Fi} Fp Fc Fi} v69 v70} FC37{ BC35 v75 v76 FC10} FC37 FC34 FC38{ BC35 v77} FC38 FC38 FC38 FC38 FC39{ BC35 v78 v79} FC40{ BC5 vd} FC41{ BC5 vd Fp[4]} FC42{ BC5 vd v80 v81 Fp[2] Fi[2]} FC43{ vd m Fp FC44{ m Fp} Fp Fi Fp} FC45{ BC2 BC3 vd v82 v83 v84 v85 v86 FC46{ BC35 v87} FC46 FC46 FC38 FC47{ BC35 v88 v89 v90 Fp} FC34 Fp[2] FC48{ m FC16 Fp[2]}} FC49{ BC2 BC3 vd v91 v92 v93 v94 v95 Fp FC50{ BC5 BC8 vd v96 v97 v98 v99 v100 v101 v102 v103 v104 v105 v106 v107 v108 FC44 FC51{ m Fp} FC51 Fi[2] FC52{ BC53{ vd v109 v110} FC10 Fi FL[2] Fi} Fp FC54{ m Fp[2] FC55{ vd v111 v112 FC56{ m Fp Fi[2] FC57{ m}} FC58{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]} Fc FC59{ BC60{ BC61{ BC62{ vd v117 v118 v119 v120 v121 v122 v123 v124 v125 v126 Fp[2] FC9 Fp} vd v127 v128 v129 v130 v131 v132 v133 v134 v135 v136 v137 v138 v139 v140 FC30 FC56 FC63{ m FC64{ m FL[2]}} FC9} v141 v142 v143 v144 FC65{ BC66{ BC62 vd v149 v150 v151 v152 v153 v154 Fp Fi FC67{ m Fp Fi FC57 FC68{ m}} FC63 Fi} vd v145 v146 v147 v148 FC9[4] FC63 FC63 FC63 FC63 Fi[6]} FC63 FC63} v113 v114 v115 v116 FC25 FC63} FC69{ BC62 vd v155 v156 v157 v158 v159 v160 Fp[2] FC63 FC63 FC63 Fi[13] Fp[3] Fi[3]} FC20[2] FC20[2] FC63 FC70{ vd m Fp[2] FC67 FC71{ vd m FL[2] Fi FC10 FC10 FC10 FC10 FC44}} FC9 Fp[2] FC9 Fp[3] Fc} FC38 FC34 FC72{ BC73{ BC5 BC8 vd v164 v165 v166 FC71 FL Fi} vd v161 v162 v163} FC72 FC74{ BC5 BC8 vd v167 v168 v169 v170 v171 v172 v173 v174 FC54 FC44 Fp} FC75{ BC23 BC2 vd v175 v176 v177 v178 v179 v180 Fi Fp Fi FC24} FC76{ BC8 vd v181 v182 v183 v184} FC71 FC46 FC46 Fp} FC77{ vd m Fc FC78{ m Fp} FC79{ m Fp Fi[2] FC68}} FC48 Fi Fc[2] Fp FC80{ BC81{} vd Fp[2] FC10 FC10 FC10 FC10 FC10 FL Fi FC25 FC25 Fi[2] FC44 Fi Fc Fi Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1} FC82{ BC81 FC10 FC10} Fp[3] Fc FC83{ m Fp[2]} Fp}


 S10103C1 ::~S10103C1(){ note_dtor("S10103C1", this);}
void  S10103C1 ::v1(){vfunc_called(this, "_ZN8S10103C12v1Ev");}
void  S10103C1 ::v2(){vfunc_called(this, "_ZN8S10103C12v2Ev");}
void  S10103C1 ::v3(){vfunc_called(this, "_ZN8S10103C12v3Ev");}
void  S10103C1 ::v4(){vfunc_called(this, "_ZN8S10103C12v4Ev");}
void  S10103C1 ::v5(){vfunc_called(this, "_ZN8S10103C12v5Ev");}
S10103C1 ::S10103C1(){ note_ctor("S10103C1", this);} // tgen

static void Test_S10103C1()
{
  extern Class_Descriptor cd_S10103C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(1075,1485)];
    init_test(&cd_S10103C1, buf);
    S10103C1 *dp, &lv = *(dp=new (buf) S10103C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8592,5936), "sizeof(S10103C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10103C1)");
    check_base_class_offset(lv, (S10103C2_nt*), 0, "S10103C1");
    check_base_class_offset(lv, (S10103C3_nt*), ABISELECT(8,4), "S10103C1");
    check_field_offset(lv, s10103c1f0, ABISELECT(24,12), "S10103C1.s10103c1f0");
    check_field_offset(lv, s10103c1f1, ABISELECT(416,292), "S10103C1.s10103c1f1");
    check_field_offset(lv, s10103c1f2, ABISELECT(432,300), "S10103C1.s10103c1f2");
    check_field_offset(lv, s10103c1f3, ABISELECT(728,540), "S10103C1.s10103c1f3");
    check_field_offset(lv, s10103c1f4, ABISELECT(1048,792), "S10103C1.s10103c1f4");
    check_field_offset(lv, s10103c1f5, ABISELECT(1376,1016), "S10103C1.s10103c1f5");
    check_field_offset(lv, s10103c1f6, ABISELECT(1640,1184), "S10103C1.s10103c1f6");
    check_field_offset(lv, s10103c1f7, ABISELECT(1816,1300), "S10103C1.s10103c1f7");
    check_field_offset(lv, s10103c1f8, ABISELECT(2064,1472), "S10103C1.s10103c1f8");
    check_field_offset(lv, s10103c1f9, ABISELECT(2128,1512), "S10103C1.s10103c1f9");
    check_field_offset(lv, s10103c1f10, ABISELECT(2304,1628), "S10103C1.s10103c1f10");
    check_field_offset(lv, s10103c1f11, ABISELECT(2440,1720), "S10103C1.s10103c1f11");
    check_field_offset(lv, s10103c1f12, ABISELECT(2592,1824), "S10103C1.s10103c1f12");
    check_field_offset(lv, s10103c1f13, ABISELECT(2744,1928), "S10103C1.s10103c1f13");
    check_field_offset(lv, s10103c1f14, ABISELECT(2880,2020), "S10103C1.s10103c1f14");
    check_field_offset(lv, s10103c1f15, ABISELECT(3016,2112), "S10103C1.s10103c1f15");
    check_field_offset(lv, s10103c1f16, ABISELECT(3152,2204), "S10103C1.s10103c1f16");
    check_field_offset(lv, s10103c1f17, ABISELECT(3288,2296), "S10103C1.s10103c1f17");
    check_field_offset(lv, s10103c1f18, ABISELECT(3424,2388), "S10103C1.s10103c1f18");
    check_field_offset(lv, s10103c1f19, ABISELECT(3560,2480), "S10103C1.s10103c1f19");
    check_field_offset(lv, s10103c1f20, ABISELECT(3696,2572), "S10103C1.s10103c1f20");
    check_field_offset(lv, s10103c1f21, ABISELECT(3744,2604), "S10103C1.s10103c1f21");
    check_field_offset(lv, s10103c1f22, ABISELECT(3824,2652), "S10103C1.s10103c1f22");
    check_field_offset(lv, s10103c1f23, ABISELECT(3896,2700), "S10103C1.s10103c1f23");
    check_field_offset(lv, s10103c1f24, ABISELECT(3944,2724), "S10103C1.s10103c1f24");
    check_field_offset(lv, s10103c1f25, ABISELECT(4848,3324), "S10103C1.s10103c1f25");
    check_field_offset(lv, s10103c1f26, ABISELECT(8232,5692), "S10103C1.s10103c1f26");
    check_field_offset(lv, s10103c1f27, ABISELECT(8280,5720), "S10103C1.s10103c1f27");
    check_field_offset(lv, s10103c1f28, ABISELECT(8320,5744), "S10103C1.s10103c1f28");
    check_field_offset(lv, s10103c1f29, ABISELECT(8324,5748), "S10103C1.s10103c1f29");
    check_field_offset(lv, s10103c1f30, ABISELECT(8328,5752), "S10103C1.s10103c1f30");
    check_field_offset(lv, s10103c1f31, ABISELECT(8336,5756), "S10103C1.s10103c1f31");
    check_field_offset(lv, s10103c1f32, ABISELECT(8504,5884), "S10103C1.s10103c1f32");
    check_field_offset(lv, s10103c1f33, ABISELECT(8536,5908), "S10103C1.s10103c1f33");
    check_field_offset(lv, s10103c1f34, ABISELECT(8560,5920), "S10103C1.s10103c1f34");
    check_field_offset(lv, s10103c1f35, ABISELECT(8568,5924), "S10103C1.s10103c1f35");
    check_field_offset(lv, s10103c1f36, ABISELECT(8584,5932), "S10103C1.s10103c1f36");
    test_class_info(&lv, &cd_S10103C1);
    dp->~S10103C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10103C1(Test_S10103C1, "S10103C1", ABISELECT(8592,5936));

#else // __cplusplus

extern void _ZN8S10103C1C1Ev();
extern void _ZN8S10103C1D1Ev();
Name_Map name_map_S10103C1[] = {
  NSPAIR(_ZN8S10103C1C1Ev),
  NSPAIR(_ZN8S10103C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C2_nt;
extern VTBL_ENTRY _ZTI11S10103C2_nt[];
extern  VTBL_ENTRY _ZTV11S10103C2_nt[];
extern Class_Descriptor cd_S10103C3_nt;
extern VTBL_ENTRY _ZTI11S10103C3_nt[];
extern  VTBL_ENTRY _ZTV11S10103C3_nt[];
static Base_Class bases_S10103C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10103C3_nt,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10103C1[];
extern void _ZN8S10103C1D1Ev();
extern void _ZN8S10103C1D0Ev();
extern void _ZN11S10103C2_nt2v6Ev();
extern void _ZN8S10103C12v1Ev();
extern void _ZN8S10103C12v2Ev();
extern void _ZN8S10103C12v3Ev();
extern void _ZN8S10103C12v4Ev();
extern void _ZN8S10103C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10103C1D1Ev,_ZThn4_N8S10103C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10103C1D0Ev,_ZThn4_N8S10103C1D0Ev)();
extern void _ZN11S10103C3_nt2v7Ev();
extern void _ZN11S10103C3_nt2v8Ev();
extern void _ZN11S10103C3_nt2v9Ev();
extern void _ZN11S10103C3_nt3v10Ev();
extern void _ZN11S10103C3_nt3v11Ev();
static  VTBL_ENTRY vtc_S10103C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10103C1[0]),
  (VTBL_ENTRY)&_ZN8S10103C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10103C1D0Ev,
  (VTBL_ENTRY)&_ZN11S10103C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN8S10103C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10103C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10103C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10103C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10103C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10103C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10103C1D1Ev,_ZThn4_N8S10103C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10103C1D0Ev,_ZThn4_N8S10103C1D0Ev),
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v7Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v8Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt2v9Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v10Ev,
  (VTBL_ENTRY)&_ZN11S10103C3_nt3v11Ev,
};
extern VTBL_ENTRY _ZTI8S10103C1[];
extern  VTBL_ENTRY _ZTV8S10103C1[];
Class_Descriptor cd_S10103C1 = {  "S10103C1", // class name
  bases_S10103C1, 2,
  &(vtc_S10103C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8592,5936), // object size
  NSPAIRA(_ZTI8S10103C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10103C1),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C2  {
  virtual  ~S10102C2(); // _ZN8S10102C2D1Ev
  virtual void  v6(); // _ZN8S10102C22v6Ev
  S10102C2(); // tgen
};
//SIG(-1 S10102C2) C1{ vd v1}


 S10102C2 ::~S10102C2(){ note_dtor("S10102C2", this);}
void  S10102C2 ::v6(){vfunc_called(this, "_ZN8S10102C22v6Ev");}
S10102C2 ::S10102C2(){ note_ctor("S10102C2", this);} // tgen

static void Test_S10102C2()
{
  extern Class_Descriptor cd_S10102C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S10102C2, buf);
    S10102C2 *dp, &lv = *(dp=new (buf) S10102C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10102C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C2)");
    test_class_info(&lv, &cd_S10102C2);
    dp->~S10102C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C2(Test_S10102C2, "S10102C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S10102C2C1Ev();
extern void _ZN8S10102C2D1Ev();
Name_Map name_map_S10102C2[] = {
  NSPAIR(_ZN8S10102C2C1Ev),
  NSPAIR(_ZN8S10102C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10102C2[];
extern void _ZN8S10102C2D1Ev();
extern void _ZN8S10102C2D0Ev();
extern void _ZN8S10102C22v6Ev();
static  VTBL_ENTRY vtc_S10102C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10102C2[0]),
  (VTBL_ENTRY)&_ZN8S10102C2D1Ev,
  (VTBL_ENTRY)&_ZN8S10102C2D0Ev,
  (VTBL_ENTRY)&_ZN8S10102C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10102C2[];
extern  VTBL_ENTRY _ZTV8S10102C2[];
Class_Descriptor cd_S10102C2 = {  "S10102C2", // class name
  0,0,//no base classes
  &(vtc_S10102C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S10102C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10102C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C3  {
  void *s10102c3f0;
  virtual  ~S10102C3(); // _ZN8S10102C3D1Ev
  virtual void  v7(); // _ZN8S10102C32v7Ev
  virtual void  v8(); // _ZN8S10102C32v8Ev
  virtual void  v9(); // _ZN8S10102C32v9Ev
  virtual void  v10(); // _ZN8S10102C33v10Ev
  virtual void  v11(); // _ZN8S10102C33v11Ev
  S10102C3(); // tgen
};
//SIG(-1 S10102C3) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10102C3 ::~S10102C3(){ note_dtor("S10102C3", this);}
void  S10102C3 ::v7(){vfunc_called(this, "_ZN8S10102C32v7Ev");}
void  S10102C3 ::v8(){vfunc_called(this, "_ZN8S10102C32v8Ev");}
void  S10102C3 ::v9(){vfunc_called(this, "_ZN8S10102C32v9Ev");}
void  S10102C3 ::v10(){vfunc_called(this, "_ZN8S10102C33v10Ev");}
void  S10102C3 ::v11(){vfunc_called(this, "_ZN8S10102C33v11Ev");}
S10102C3 ::S10102C3(){ note_ctor("S10102C3", this);} // tgen

static void Test_S10102C3()
{
  extern Class_Descriptor cd_S10102C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_S10102C3, buf);
    S10102C3 *dp, &lv = *(dp=new (buf) S10102C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S10102C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C3)");
    check_field_offset(lv, s10102c3f0, ABISELECT(8,4), "S10102C3.s10102c3f0");
    test_class_info(&lv, &cd_S10102C3);
    dp->~S10102C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C3(Test_S10102C3, "S10102C3", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN8S10102C3C1Ev();
extern void _ZN8S10102C3D1Ev();
Name_Map name_map_S10102C3[] = {
  NSPAIR(_ZN8S10102C3C1Ev),
  NSPAIR(_ZN8S10102C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10102C3[];
extern void _ZN8S10102C3D1Ev();
extern void _ZN8S10102C3D0Ev();
extern void _ZN8S10102C32v7Ev();
extern void _ZN8S10102C32v8Ev();
extern void _ZN8S10102C32v9Ev();
extern void _ZN8S10102C33v10Ev();
extern void _ZN8S10102C33v11Ev();
static  VTBL_ENTRY vtc_S10102C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10102C3[0]),
  (VTBL_ENTRY)&_ZN8S10102C3D1Ev,
  (VTBL_ENTRY)&_ZN8S10102C3D0Ev,
  (VTBL_ENTRY)&_ZN8S10102C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10102C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10102C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10102C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10102C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10102C3[];
extern  VTBL_ENTRY _ZTV8S10102C3[];
Class_Descriptor cd_S10102C3 = {  "S10102C3", // class name
  0,0,//no base classes
  &(vtc_S10102C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI8S10102C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10102C3),9, //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

struct  S10102C12  {
  void *s10102c12f0;
  ::S10103C13_nt s10102c12f1;
  ::S10103C16_nt s10102c12f2;
  ::S10103C17 s10102c12f3;
  virtual  ~S10102C12(); // _ZN9S10102C12D1Ev
  virtual void  v14(); // _ZN9S10102C123v14Ev
  virtual void  v15(); // _ZN9S10102C123v15Ev
  virtual void  v16(); // _ZN9S10102C123v16Ev
  virtual void  v17(); // _ZN9S10102C123v17Ev
  virtual void  v18(); // _ZN9S10102C123v18Ev
  virtual void  v19(); // _ZN9S10102C123v19Ev
  virtual void  v20(); // _ZN9S10102C123v20Ev
  virtual void  v21(); // _ZN9S10102C123v21Ev
  virtual void  v22(); // _ZN9S10102C123v22Ev
  virtual void  v23(); // _ZN9S10102C123v23Ev
  virtual void  v24(); // _ZN9S10102C123v24Ev
  virtual void  v25(); // _ZN9S10102C123v25Ev
  virtual void  v26(); // _ZN9S10102C123v26Ev
  virtual void  v27(); // _ZN9S10102C123v27Ev
  virtual void  v28(); // _ZN9S10102C123v28Ev
  virtual void  v29(); // _ZN9S10102C123v29Ev
  virtual void  v30(); // _ZN9S10102C123v30Ev
  virtual void  v31(); // _ZN9S10102C123v31Ev
  virtual void  v32(); // _ZN9S10102C123v32Ev
  virtual void  v33(); // _ZN9S10102C123v33Ev
  virtual void  v34(); // _ZN9S10102C123v34Ev
  virtual void  v35(); // _ZN9S10102C123v35Ev
  virtual void  v36(); // _ZN9S10102C123v36Ev
  virtual void  v37(); // _ZN9S10102C123v37Ev
  S10102C12(); // tgen
};
//SIG(-1 S10102C12) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S10102C12 ::~S10102C12(){ note_dtor("S10102C12", this);}
void  S10102C12 ::v14(){vfunc_called(this, "_ZN9S10102C123v14Ev");}
void  S10102C12 ::v15(){vfunc_called(this, "_ZN9S10102C123v15Ev");}
void  S10102C12 ::v16(){vfunc_called(this, "_ZN9S10102C123v16Ev");}
void  S10102C12 ::v17(){vfunc_called(this, "_ZN9S10102C123v17Ev");}
void  S10102C12 ::v18(){vfunc_called(this, "_ZN9S10102C123v18Ev");}
void  S10102C12 ::v19(){vfunc_called(this, "_ZN9S10102C123v19Ev");}
void  S10102C12 ::v20(){vfunc_called(this, "_ZN9S10102C123v20Ev");}
void  S10102C12 ::v21(){vfunc_called(this, "_ZN9S10102C123v21Ev");}
void  S10102C12 ::v22(){vfunc_called(this, "_ZN9S10102C123v22Ev");}
void  S10102C12 ::v23(){vfunc_called(this, "_ZN9S10102C123v23Ev");}
void  S10102C12 ::v24(){vfunc_called(this, "_ZN9S10102C123v24Ev");}
void  S10102C12 ::v25(){vfunc_called(this, "_ZN9S10102C123v25Ev");}
void  S10102C12 ::v26(){vfunc_called(this, "_ZN9S10102C123v26Ev");}
void  S10102C12 ::v27(){vfunc_called(this, "_ZN9S10102C123v27Ev");}
void  S10102C12 ::v28(){vfunc_called(this, "_ZN9S10102C123v28Ev");}
void  S10102C12 ::v29(){vfunc_called(this, "_ZN9S10102C123v29Ev");}
void  S10102C12 ::v30(){vfunc_called(this, "_ZN9S10102C123v30Ev");}
void  S10102C12 ::v31(){vfunc_called(this, "_ZN9S10102C123v31Ev");}
void  S10102C12 ::v32(){vfunc_called(this, "_ZN9S10102C123v32Ev");}
void  S10102C12 ::v33(){vfunc_called(this, "_ZN9S10102C123v33Ev");}
void  S10102C12 ::v34(){vfunc_called(this, "_ZN9S10102C123v34Ev");}
void  S10102C12 ::v35(){vfunc_called(this, "_ZN9S10102C123v35Ev");}
void  S10102C12 ::v36(){vfunc_called(this, "_ZN9S10102C123v36Ev");}
void  S10102C12 ::v37(){vfunc_called(this, "_ZN9S10102C123v37Ev");}
S10102C12 ::S10102C12(){ note_ctor("S10102C12", this);} // tgen

static void Test_S10102C12()
{
  extern Class_Descriptor cd_S10102C12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S10102C12, buf);
    S10102C12 *dp, &lv = *(dp=new (buf) S10102C12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S10102C12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C12)");
    check_field_offset(lv, s10102c12f0, ABISELECT(8,4), "S10102C12.s10102c12f0");
    check_field_offset(lv, s10102c12f1, ABISELECT(16,8), "S10102C12.s10102c12f1");
    check_field_offset(lv, s10102c12f2, ABISELECT(40,24), "S10102C12.s10102c12f2");
    check_field_offset(lv, s10102c12f3, ABISELECT(96,64), "S10102C12.s10102c12f3");
    test_class_info(&lv, &cd_S10102C12);
    dp->~S10102C12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C12(Test_S10102C12, "S10102C12", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN9S10102C12C1Ev();
extern void _ZN9S10102C12D1Ev();
Name_Map name_map_S10102C12[] = {
  NSPAIR(_ZN9S10102C12C1Ev),
  NSPAIR(_ZN9S10102C12D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10102C12[];
extern void _ZN9S10102C12D1Ev();
extern void _ZN9S10102C12D0Ev();
extern void _ZN9S10102C123v14Ev();
extern void _ZN9S10102C123v15Ev();
extern void _ZN9S10102C123v16Ev();
extern void _ZN9S10102C123v17Ev();
extern void _ZN9S10102C123v18Ev();
extern void _ZN9S10102C123v19Ev();
extern void _ZN9S10102C123v20Ev();
extern void _ZN9S10102C123v21Ev();
extern void _ZN9S10102C123v22Ev();
extern void _ZN9S10102C123v23Ev();
extern void _ZN9S10102C123v24Ev();
extern void _ZN9S10102C123v25Ev();
extern void _ZN9S10102C123v26Ev();
extern void _ZN9S10102C123v27Ev();
extern void _ZN9S10102C123v28Ev();
extern void _ZN9S10102C123v29Ev();
extern void _ZN9S10102C123v30Ev();
extern void _ZN9S10102C123v31Ev();
extern void _ZN9S10102C123v32Ev();
extern void _ZN9S10102C123v33Ev();
extern void _ZN9S10102C123v34Ev();
extern void _ZN9S10102C123v35Ev();
extern void _ZN9S10102C123v36Ev();
extern void _ZN9S10102C123v37Ev();
static  VTBL_ENTRY vtc_S10102C12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10102C12[0]),
  (VTBL_ENTRY)&_ZN9S10102C12D1Ev,
  (VTBL_ENTRY)&_ZN9S10102C12D0Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10102C12[];
extern  VTBL_ENTRY _ZTV9S10102C12[];
Class_Descriptor cd_S10102C12 = {  "S10102C12", // class name
  0,0,//no base classes
  &(vtc_S10102C12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI9S10102C12),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10102C12),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C23_nt  {
  long s10102c23f0[4];
};
//SIG(-1 S10102C23_nt) C1{ Fl[4]}



//skip512 S10102C23_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C22_nt  {
  ::S10102C23_nt s10102c22f0;
  void  mf10102c22(); // _ZN12S10102C22_nt10mf10102c22Ev
};
//SIG(-1 S10102C22_nt) C1{ m FC2{ Fl[4]}}


void  S10102C22_nt ::mf10102c22(){}

//skip512 S10102C22_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C19  {
  int s10102c19f0;
  ::S10103C106 s10102c19f1;
  ::S10102C22_nt s10102c19f2;
  void  mf10102c19(); // _ZN9S10102C1910mf10102c19Ev
  virtual  ~S10102C19(); // _ZN9S10102C19D1Ev
  S10102C19(); // tgen
};
//SIG(-1 S10102C19) C1{ vd m Fi FC2{ m Fp Fi[2] FC3{ m}} FC4{ m FC5{ Fl[4]}}}


void  S10102C19 ::mf10102c19(){}
 S10102C19 ::~S10102C19(){ note_dtor("S10102C19", this);}
S10102C19 ::S10102C19(){ note_ctor("S10102C19", this);} // tgen

static void Test_S10102C19()
{
  extern Class_Descriptor cd_S10102C19;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,11)];
    init_test(&cd_S10102C19, buf);
    S10102C19 *dp, &lv = *(dp=new (buf) S10102C19());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,40), "sizeof(S10102C19)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C19)");
    check_field_offset(lv, s10102c19f0, ABISELECT(8,4), "S10102C19.s10102c19f0");
    check_field_offset(lv, s10102c19f1, ABISELECT(16,8), "S10102C19.s10102c19f1");
    check_field_offset(lv, s10102c19f2, ABISELECT(40,24), "S10102C19.s10102c19f2");
    test_class_info(&lv, &cd_S10102C19);
    dp->~S10102C19();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C19(Test_S10102C19, "S10102C19", ABISELECT(72,40));

#else // __cplusplus

extern void _ZN9S10102C19C1Ev();
extern void _ZN9S10102C19D1Ev();
Name_Map name_map_S10102C19[] = {
  NSPAIR(_ZN9S10102C19C1Ev),
  NSPAIR(_ZN9S10102C19D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10102C19[];
extern void _ZN9S10102C19D1Ev();
extern void _ZN9S10102C19D0Ev();
static  VTBL_ENTRY vtc_S10102C19[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10102C19[0]),
  (VTBL_ENTRY)&_ZN9S10102C19D1Ev,
  (VTBL_ENTRY)&_ZN9S10102C19D0Ev,
};
extern VTBL_ENTRY _ZTI9S10102C19[];
extern  VTBL_ENTRY _ZTV9S10102C19[];
Class_Descriptor cd_S10102C19 = {  "S10102C19", // class name
  0,0,//no base classes
  &(vtc_S10102C19[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,40), // object size
  NSPAIRA(_ZTI9S10102C19),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10102C19),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C4  : S10103C5_nt , S10102C12 {
  int s10102c4f0;
  void *s10102c4f1[8];
  int s10102c4f2[2];
  ::S10103C18 s10102c4f3;
  int s10102c4f4[4];
  char s10102c4f5;
  ::S10102C19 s10102c4f6;
  void *s10102c4f7;
  virtual  ~S10102C4(); // _ZN8S10102C4D1Ev
  virtual void  v12(); // _ZN8S10102C43v12Ev
  virtual void  v13(); // _ZN8S10102C43v13Ev
  S10102C4(); // tgen
};
//SIG(-1 S10102C4) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 Fi Fp[8] Fi[2] FC11{ Fi[11]} Fi[4] Fc FC12{ vd m Fi FC13{ m Fp Fi[2] FC14{ m}} FC15{ m FC16{ Fl[4]}}} Fp}


 S10102C4 ::~S10102C4(){ note_dtor("S10102C4", this);}
void  S10102C4 ::v12(){vfunc_called(this, "_ZN8S10102C43v12Ev");}
void  S10102C4 ::v13(){vfunc_called(this, "_ZN8S10102C43v13Ev");}
S10102C4 ::S10102C4(){ note_ctor("S10102C4", this);} // tgen

static void Test_S10102C4()
{
  extern Class_Descriptor cd_S10102C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(50,67)];
    init_test(&cd_S10102C4, buf);
    S10102C4 *dp, &lv = *(dp=new (buf) S10102C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(392,264), "sizeof(S10102C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C4)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10102C4");
    check_base_class_offset(lv, (S10102C12*), ABISELECT(48,32), "S10102C4");
    check_field_offset(lv, s10102c4f0, ABISELECT(168,112), "S10102C4.s10102c4f0");
    check_field_offset(lv, s10102c4f1, ABISELECT(176,116), "S10102C4.s10102c4f1");
    check_field_offset(lv, s10102c4f2, ABISELECT(240,148), "S10102C4.s10102c4f2");
    check_field_offset(lv, s10102c4f3, ABISELECT(248,156), "S10102C4.s10102c4f3");
    check_field_offset(lv, s10102c4f4, ABISELECT(292,200), "S10102C4.s10102c4f4");
    check_field_offset(lv, s10102c4f5, ABISELECT(308,216), "S10102C4.s10102c4f5");
    check_field_offset(lv, s10102c4f6, ABISELECT(312,220), "S10102C4.s10102c4f6");
    check_field_offset(lv, s10102c4f7, ABISELECT(384,260), "S10102C4.s10102c4f7");
    test_class_info(&lv, &cd_S10102C4);
    dp->~S10102C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C4(Test_S10102C4, "S10102C4", ABISELECT(392,264));

#else // __cplusplus

extern void _ZN8S10102C4C1Ev();
extern void _ZN8S10102C4D1Ev();
Name_Map name_map_S10102C4[] = {
  NSPAIR(_ZN8S10102C4C1Ev),
  NSPAIR(_ZN8S10102C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10102C12;
extern VTBL_ENTRY _ZTI9S10102C12[];
extern  VTBL_ENTRY _ZTV9S10102C12[];
static Base_Class bases_S10102C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10102C12,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10102C4[];
extern void _ZN8S10102C4D1Ev();
extern void _ZN8S10102C4D0Ev();
extern void _ZN8S10102C43v12Ev();
extern void _ZN8S10102C43v13Ev();
extern void ABISELECT(_ZThn48_N8S10102C4D1Ev,_ZThn32_N8S10102C4D1Ev)();
extern void ABISELECT(_ZThn48_N8S10102C4D0Ev,_ZThn32_N8S10102C4D0Ev)();
extern void _ZN9S10102C123v14Ev();
extern void _ZN9S10102C123v15Ev();
extern void _ZN9S10102C123v16Ev();
extern void _ZN9S10102C123v17Ev();
extern void _ZN9S10102C123v18Ev();
extern void _ZN9S10102C123v19Ev();
extern void _ZN9S10102C123v20Ev();
extern void _ZN9S10102C123v21Ev();
extern void _ZN9S10102C123v22Ev();
extern void _ZN9S10102C123v23Ev();
extern void _ZN9S10102C123v24Ev();
extern void _ZN9S10102C123v25Ev();
extern void _ZN9S10102C123v26Ev();
extern void _ZN9S10102C123v27Ev();
extern void _ZN9S10102C123v28Ev();
extern void _ZN9S10102C123v29Ev();
extern void _ZN9S10102C123v30Ev();
extern void _ZN9S10102C123v31Ev();
extern void _ZN9S10102C123v32Ev();
extern void _ZN9S10102C123v33Ev();
extern void _ZN9S10102C123v34Ev();
extern void _ZN9S10102C123v35Ev();
extern void _ZN9S10102C123v36Ev();
extern void _ZN9S10102C123v37Ev();
static  VTBL_ENTRY vtc_S10102C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10102C4[0]),
  (VTBL_ENTRY)&_ZN8S10102C4D1Ev,
  (VTBL_ENTRY)&_ZN8S10102C4D0Ev,
  (VTBL_ENTRY)&_ZN8S10102C43v12Ev,
  (VTBL_ENTRY)&_ZN8S10102C43v13Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8S10102C4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10102C4D1Ev,_ZThn32_N8S10102C4D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10102C4D0Ev,_ZThn32_N8S10102C4D0Ev),
  (VTBL_ENTRY)&_ZN9S10102C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10102C123v37Ev,
};
extern VTBL_ENTRY _ZTI8S10102C4[];
extern  VTBL_ENTRY _ZTV8S10102C4[];
Class_Descriptor cd_S10102C4 = {  "S10102C4", // class name
  bases_S10102C4, 2,
  &(vtc_S10102C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(392,264), // object size
  NSPAIRA(_ZTI8S10102C4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10102C4),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C41  : S10103C5_nt {
  ::S10103C42 s10102c41f0;
  void *s10102c41f1;
  char s10102c41f2;
  int s10102c41f3;
  virtual  ~S10102C41(); // _ZN9S10102C41D1Ev
  virtual void  v71(); // _ZN9S10102C413v71Ev
  virtual void  v72(); // _ZN9S10102C413v72Ev
  virtual void  v73(); // _ZN9S10102C413v73Ev
  virtual void  v74(); // _ZN9S10102C413v74Ev
  S10102C41(); // tgen
};
//SIG(-1 S10102C41) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd v1 v2 v3 v4 FC5{ m Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC7 FC7 Fi} Fp Fc Fi}


 S10102C41 ::~S10102C41(){ note_dtor("S10102C41", this);}
void  S10102C41 ::v71(){vfunc_called(this, "_ZN9S10102C413v71Ev");}
void  S10102C41 ::v72(){vfunc_called(this, "_ZN9S10102C413v72Ev");}
void  S10102C41 ::v73(){vfunc_called(this, "_ZN9S10102C413v73Ev");}
void  S10102C41 ::v74(){vfunc_called(this, "_ZN9S10102C413v74Ev");}
S10102C41 ::S10102C41(){ note_ctor("S10102C41", this);} // tgen

static void Test_S10102C41()
{
  extern Class_Descriptor cd_S10102C41;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10102C41, buf);
    S10102C41 *dp, &lv = *(dp=new (buf) S10102C41());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10102C41)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C41)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10102C41");
    check_field_offset(lv, s10102c41f0, ABISELECT(48,32), "S10102C41.s10102c41f0");
    check_field_offset(lv, s10102c41f1, ABISELECT(120,80), "S10102C41.s10102c41f1");
    check_field_offset(lv, s10102c41f2, ABISELECT(128,84), "S10102C41.s10102c41f2");
    check_field_offset(lv, s10102c41f3, ABISELECT(132,88), "S10102C41.s10102c41f3");
    test_class_info(&lv, &cd_S10102C41);
    dp->~S10102C41();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C41(Test_S10102C41, "S10102C41", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10102C41C1Ev();
extern void _ZN9S10102C41D1Ev();
Name_Map name_map_S10102C41[] = {
  NSPAIR(_ZN9S10102C41C1Ev),
  NSPAIR(_ZN9S10102C41D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10102C41[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10102C41[];
extern void _ZN9S10102C41D1Ev();
extern void _ZN9S10102C41D0Ev();
extern void _ZN9S10102C413v71Ev();
extern void _ZN9S10102C413v72Ev();
extern void _ZN9S10102C413v73Ev();
extern void _ZN9S10102C413v74Ev();
static  VTBL_ENTRY vtc_S10102C41[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10102C41[0]),
  (VTBL_ENTRY)&_ZN9S10102C41D1Ev,
  (VTBL_ENTRY)&_ZN9S10102C41D0Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v74Ev,
};
extern VTBL_ENTRY _ZTI9S10102C41[];
extern  VTBL_ENTRY _ZTV9S10102C41[];
Class_Descriptor cd_S10102C41 = {  "S10102C41", // class name
  bases_S10102C41, 1,
  &(vtc_S10102C41[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10102C41),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10102C41),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C49  : S10102C41 {
  virtual void  v81(); // _ZN9S10102C493v81Ev
  virtual void  v82(); // _ZN9S10102C493v82Ev
  ~S10102C49(); // tgen
  S10102C49(); // tgen
};
//SIG(-1 S10102C49) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v3 v4 v5 v6 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1 v2}


void  S10102C49 ::v81(){vfunc_called(this, "_ZN9S10102C493v81Ev");}
void  S10102C49 ::v82(){vfunc_called(this, "_ZN9S10102C493v82Ev");}
S10102C49 ::~S10102C49(){ note_dtor("S10102C49", this);} // tgen
S10102C49 ::S10102C49(){ note_ctor("S10102C49", this);} // tgen

static void Test_S10102C49()
{
  extern Class_Descriptor cd_S10102C49;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10102C49, buf);
    S10102C49 *dp, &lv = *(dp=new (buf) S10102C49());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10102C49)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C49)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10102C41*), 0, "S10102C49");
    check_base_class_offset(lv, (S10102C41*), 0, "S10102C49");
    test_class_info(&lv, &cd_S10102C49);
    dp->~S10102C49();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C49(Test_S10102C49, "S10102C49", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10102C49C1Ev();
extern void _ZN9S10102C49D1Ev();
Name_Map name_map_S10102C49[] = {
  NSPAIR(_ZN9S10102C49C1Ev),
  NSPAIR(_ZN9S10102C49D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10102C41;
extern VTBL_ENTRY _ZTI9S10102C41[];
extern  VTBL_ENTRY _ZTV9S10102C41[];
static Base_Class bases_S10102C49[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10102C41,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10102C49[];
extern void _ZN9S10102C49D1Ev();
extern void _ZN9S10102C49D0Ev();
extern void _ZN9S10102C413v71Ev();
extern void _ZN9S10102C413v72Ev();
extern void _ZN9S10102C413v73Ev();
extern void _ZN9S10102C413v74Ev();
extern void _ZN9S10102C493v81Ev();
extern void _ZN9S10102C493v82Ev();
static  VTBL_ENTRY vtc_S10102C49[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10102C49[0]),
  (VTBL_ENTRY)&_ZN9S10102C49D1Ev,
  (VTBL_ENTRY)&_ZN9S10102C49D0Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v71Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v72Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v73Ev,
  (VTBL_ENTRY)&_ZN9S10102C413v74Ev,
  (VTBL_ENTRY)&_ZN9S10102C493v81Ev,
  (VTBL_ENTRY)&_ZN9S10102C493v82Ev,
};
extern VTBL_ENTRY _ZTI9S10102C49[];
extern  VTBL_ENTRY _ZTV9S10102C49[];
Class_Descriptor cd_S10102C49 = {  "S10102C49", // class name
  bases_S10102C49, 2,
  &(vtc_S10102C49[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10102C49),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10102C49),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10102C1  : S10102C2 , S10102C3 {
  ::S10102C4 s10102c1f0;
  void *s10102c1f1[2];
  ::S10103C24 s10102c1f2;
  ::S10103C26 s10102c1f3;
  ::S10103C27 s10102c1f4;
  ::S10103C32 s10102c1f5;
  ::S10103C33 s10102c1f6;
  ::S10103C34 s10102c1f7;
  ::S10103C38 s10102c1f8;
  ::S10103C39 s10102c1f9;
  ::S10103C49 s10102c1f10;
  ::S10103C45 s10102c1f11;
  ::S10103C45 s10102c1f12;
  ::S10103C40 s10102c1f13;
  ::S10103C56 s10102c1f14;
  ::S10103C56 s10102c1f15;
  ::S10103C56 s10102c1f16;
  ::S10103C56 s10102c1f17;
  ::S10103C47 s10102c1f18;
  ::S10102C49 s10102c1f19;
  ::S10103C50 s10102c1f20;
  ::S10103C51 s10102c1f21;
  ::S10103C52 s10102c1f22;
  ::S10103C53 s10102c1f23;
  ::S10103C55 s10102c1f24;
  ::S10103C61 s10102c1f25;
  ::S10103C104 s10102c1f26;
  ::S10103C58_nt s10102c1f27;
  int s10102c1f28;
  char s10102c1f29[2];
  void *s10102c1f30;
  ::S10103C108 s10102c1f31;
  ::S10103C110 s10102c1f32;
  void *s10102c1f33[3];
  char s10102c1f34;
  ::S10103C111_nt s10102c1f35;
  void *s10102c1f36;
  virtual  ~S10102C1(); // _ZN8S10102C1D1Ev
  virtual void  v1(); // _ZN8S10102C12v1Ev
  virtual void  v2(); // _ZN8S10102C12v2Ev
  virtual void  v3(); // _ZN8S10102C12v3Ev
  virtual void  v4(); // _ZN8S10102C12v4Ev
  virtual void  v5(); // _ZN8S10102C12v5Ev
  S10102C1(); // tgen
};
//SIG(1 S10102C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 FC4{ BC5{ vd m FC6{ m Fp Fi FC7{ m} FC7} FC6 Fc} BC8{ vd v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 Fp FC9{ m FC10{ m Fp Fi FC11{ m}} Fi} FC12{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC13{ m Fc Fi[2] Fp}} vd v12 v13 Fi Fp[8] Fi[2] FC14{ Fi[11]} Fi[4] Fc FC15{ vd m Fi FC16{ m Fp Fi[2] FC17{ m}} FC18{ m FC19{ Fl[4]}}} Fp} Fp[2] FC20{ BC5 BC21{ vd v40 v41 v42 v43 v44 v45 v46 v47 v48 v49 v50 v51 v52 v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 v63 Fp FC9 FC12 FC13} vd v38 v39 FC22{ Fi[4]}[2] FC22[2] FC22[2] FC22[2]} FC23{ BC5 BC21 vd v64 v65 v66 v67 Fp[2] Fc FC22[2] FC22[2] FC22[2] FC22[2]} FC24{ BC25{ BC5 BC21 vd v71 v72 v73 v74 v75 v76 v77 v78 v79} vd v68 v69 v70 Fi[2] FC26{ m Fi Fp Fi Fp[2] Fi} FC10 FC10 FC10 FC10 FC27{ m FC28{ m FL}} FL Fi Fp Fi Fc} FC29{ BC25 vd v80 v81 v82 FC26 FC10 FC10 Fp Fi} FC30{ BC5 BC21 vd v83 v84 v85 Fp} FC31{ BC5 BC21 vd v86 v87 Fp FC32{ m Fp Fi FC33{ m} FC33} FC10 FC10 Fi[2] Fc Fi[2]} FC34{ BC5 vd Fc Fp[2]} FC35{ BC5 BC21 vd v88 v89 v90 v91 v92 Fc} FC36{ BC37{ BC5 vd v95 v96 v97 v98 FC38{ m Fp FC9 FC10 FC10 Fi} Fp Fc Fi} v93 v94} FC39{ BC37 v99 v100 FC10} FC39 FC40{ BC37 v101 v102} FC41{ BC37 v103} FC41 FC41 FC41 FC42{ BC37 v104} FC43{ BC44{ BC5 vd v107 v108 v109 v110 FC38 Fp Fc Fi} v105 v106} FC45{ BC5 vd} FC46{ BC5 vd Fp[4]} FC47{ BC5 vd v111 v112 Fp[2] Fi[2]} FC48{ vd m Fp FC49{ m Fp} Fp Fi Fp} FC50{ BC51{ vd v118} BC52{ vd v119 v120 v121 v122 v123 Fp} vd v113 v114 v115 v116 v117 FC41 FC41 FC41 FC42 FC53{ BC37 v124 v125 v126 Fp} FC40 Fp[2] FC54{ m FC55{ m Fp Fi[2] FC11} Fp[2]}} FC56{ BC51 BC52 vd v127 v128 v129 v130 v131 Fp FC57{ BC5 BC21 vd v132 v133 v134 v135 v136 v137 v138 v139 v140 v141 v142 v143 v144 FC49 FC58{ m Fp} FC58 Fi[2] FC59{ BC60{ vd v145 v146} FC10 Fi FL[2] Fi} Fp FC61{ m Fp[2] FC62{ vd v147 v148 FC63{ m Fp Fi[2] FC64{ m}} FC65{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]} Fc FC66{ BC67{ BC68{ BC69{ vd v153 v154 v155 v156 v157 v158 v159 v160 v161 v162 Fp[2] FC9 Fp} vd v163 v164 v165 v166 v167 v168 v169 v170 v171 v172 v173 v174 v175 v176 FC32 FC63 FC70{ m FC71{ m FL[2]}} FC9} v177 v178 v179 v180 FC72{ BC73{ BC69 vd v185 v186 v187 v188 v189 v190 Fp Fi FC74{ m Fp Fi FC64 FC17} FC70 Fi} vd v181 v182 v183 v184 FC9[4] FC70 FC70 FC70 FC70 Fi[6]} FC70 FC70} v149 v150 v151 v152 FC27 FC70} FC75{ BC69 vd v191 v192 v193 v194 v195 v196 Fp[2] FC70 FC70 FC70 Fi[13] Fp[3] Fi[3]} FC22[2] FC22[2] FC70 FC76{ vd m Fp[2] FC74 FC77{ vd m FL[2] Fi FC10 FC10 FC10 FC10 FC49}} FC9 Fp[2] FC9 Fp[3] Fc} FC42 FC40 FC78{ BC79{ BC5 BC21 vd v200 v201 v202 FC77 FL Fi} vd v197 v198 v199} FC78 FC80{ BC5 BC21 vd v203 v204 v205 v206 v207 v208 v209 v210 FC61 FC49 Fp} FC81{ BC25 BC51 vd v211 v212 v213 v214 v215 v216 Fi Fp Fi FC26} FC82{ BC21 vd v217 v218 v219 v220} FC77 FC41 FC41 Fp} FC83{ vd m Fc FC84{ m Fp} FC16} FC54 Fi Fc[2] Fp FC85{ BC86{} vd Fp[2] FC10 FC10 FC10 FC10 FC10 FL Fi FC27 FC27 Fi[2] FC49 Fi Fc Fi Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1} FC87{ BC86 FC10 FC10} Fp[3] Fc FC88{ m Fp[2]} Fp}


 S10102C1 ::~S10102C1(){ note_dtor("S10102C1", this);}
void  S10102C1 ::v1(){vfunc_called(this, "_ZN8S10102C12v1Ev");}
void  S10102C1 ::v2(){vfunc_called(this, "_ZN8S10102C12v2Ev");}
void  S10102C1 ::v3(){vfunc_called(this, "_ZN8S10102C12v3Ev");}
void  S10102C1 ::v4(){vfunc_called(this, "_ZN8S10102C12v4Ev");}
void  S10102C1 ::v5(){vfunc_called(this, "_ZN8S10102C12v5Ev");}
S10102C1 ::S10102C1(){ note_ctor("S10102C1", this);} // tgen

static void Test_S10102C1()
{
  extern Class_Descriptor cd_S10102C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(1075,1481)];
    init_test(&cd_S10102C1, buf);
    S10102C1 *dp, &lv = *(dp=new (buf) S10102C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8592,5920), "sizeof(S10102C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10102C1)");
    check_base_class_offset(lv, (S10102C2*), 0, "S10102C1");
    check_base_class_offset(lv, (S10102C3*), ABISELECT(8,4), "S10102C1");
    check_field_offset(lv, s10102c1f0, ABISELECT(24,12), "S10102C1.s10102c1f0");
    check_field_offset(lv, s10102c1f1, ABISELECT(416,276), "S10102C1.s10102c1f1");
    check_field_offset(lv, s10102c1f2, ABISELECT(432,284), "S10102C1.s10102c1f2");
    check_field_offset(lv, s10102c1f3, ABISELECT(728,524), "S10102C1.s10102c1f3");
    check_field_offset(lv, s10102c1f4, ABISELECT(1048,776), "S10102C1.s10102c1f4");
    check_field_offset(lv, s10102c1f5, ABISELECT(1376,1000), "S10102C1.s10102c1f5");
    check_field_offset(lv, s10102c1f6, ABISELECT(1640,1168), "S10102C1.s10102c1f6");
    check_field_offset(lv, s10102c1f7, ABISELECT(1816,1284), "S10102C1.s10102c1f7");
    check_field_offset(lv, s10102c1f8, ABISELECT(2064,1456), "S10102C1.s10102c1f8");
    check_field_offset(lv, s10102c1f9, ABISELECT(2128,1496), "S10102C1.s10102c1f9");
    check_field_offset(lv, s10102c1f10, ABISELECT(2304,1612), "S10102C1.s10102c1f10");
    check_field_offset(lv, s10102c1f11, ABISELECT(2440,1704), "S10102C1.s10102c1f11");
    check_field_offset(lv, s10102c1f12, ABISELECT(2592,1808), "S10102C1.s10102c1f12");
    check_field_offset(lv, s10102c1f13, ABISELECT(2744,1912), "S10102C1.s10102c1f13");
    check_field_offset(lv, s10102c1f14, ABISELECT(2880,2004), "S10102C1.s10102c1f14");
    check_field_offset(lv, s10102c1f15, ABISELECT(3016,2096), "S10102C1.s10102c1f15");
    check_field_offset(lv, s10102c1f16, ABISELECT(3152,2188), "S10102C1.s10102c1f16");
    check_field_offset(lv, s10102c1f17, ABISELECT(3288,2280), "S10102C1.s10102c1f17");
    check_field_offset(lv, s10102c1f18, ABISELECT(3424,2372), "S10102C1.s10102c1f18");
    check_field_offset(lv, s10102c1f19, ABISELECT(3560,2464), "S10102C1.s10102c1f19");
    check_field_offset(lv, s10102c1f20, ABISELECT(3696,2556), "S10102C1.s10102c1f20");
    check_field_offset(lv, s10102c1f21, ABISELECT(3744,2588), "S10102C1.s10102c1f21");
    check_field_offset(lv, s10102c1f22, ABISELECT(3824,2636), "S10102C1.s10102c1f22");
    check_field_offset(lv, s10102c1f23, ABISELECT(3896,2684), "S10102C1.s10102c1f23");
    check_field_offset(lv, s10102c1f24, ABISELECT(3944,2708), "S10102C1.s10102c1f24");
    check_field_offset(lv, s10102c1f25, ABISELECT(4848,3308), "S10102C1.s10102c1f25");
    check_field_offset(lv, s10102c1f26, ABISELECT(8232,5676), "S10102C1.s10102c1f26");
    check_field_offset(lv, s10102c1f27, ABISELECT(8280,5704), "S10102C1.s10102c1f27");
    check_field_offset(lv, s10102c1f28, ABISELECT(8320,5728), "S10102C1.s10102c1f28");
    check_field_offset(lv, s10102c1f29, ABISELECT(8324,5732), "S10102C1.s10102c1f29");
    check_field_offset(lv, s10102c1f30, ABISELECT(8328,5736), "S10102C1.s10102c1f30");
    check_field_offset(lv, s10102c1f31, ABISELECT(8336,5740), "S10102C1.s10102c1f31");
    check_field_offset(lv, s10102c1f32, ABISELECT(8504,5868), "S10102C1.s10102c1f32");
    check_field_offset(lv, s10102c1f33, ABISELECT(8536,5892), "S10102C1.s10102c1f33");
    check_field_offset(lv, s10102c1f34, ABISELECT(8560,5904), "S10102C1.s10102c1f34");
    check_field_offset(lv, s10102c1f35, ABISELECT(8568,5908), "S10102C1.s10102c1f35");
    check_field_offset(lv, s10102c1f36, ABISELECT(8584,5916), "S10102C1.s10102c1f36");
    test_class_info(&lv, &cd_S10102C1);
    dp->~S10102C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10102C1(Test_S10102C1, "S10102C1", ABISELECT(8592,5920));

#else // __cplusplus

extern void _ZN8S10102C1C1Ev();
extern void _ZN8S10102C1D1Ev();
Name_Map name_map_S10102C1[] = {
  NSPAIR(_ZN8S10102C1C1Ev),
  NSPAIR(_ZN8S10102C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10102C2;
extern VTBL_ENTRY _ZTI8S10102C2[];
extern  VTBL_ENTRY _ZTV8S10102C2[];
extern Class_Descriptor cd_S10102C3;
extern VTBL_ENTRY _ZTI8S10102C3[];
extern  VTBL_ENTRY _ZTV8S10102C3[];
static Base_Class bases_S10102C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10102C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10102C3,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10102C1[];
extern void _ZN8S10102C1D1Ev();
extern void _ZN8S10102C1D0Ev();
extern void _ZN8S10102C22v6Ev();
extern void _ZN8S10102C12v1Ev();
extern void _ZN8S10102C12v2Ev();
extern void _ZN8S10102C12v3Ev();
extern void _ZN8S10102C12v4Ev();
extern void _ZN8S10102C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10102C1D1Ev,_ZThn4_N8S10102C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10102C1D0Ev,_ZThn4_N8S10102C1D0Ev)();
extern void _ZN8S10102C32v7Ev();
extern void _ZN8S10102C32v8Ev();
extern void _ZN8S10102C32v9Ev();
extern void _ZN8S10102C33v10Ev();
extern void _ZN8S10102C33v11Ev();
static  VTBL_ENTRY vtc_S10102C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10102C1[0]),
  (VTBL_ENTRY)&_ZN8S10102C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10102C1D0Ev,
  (VTBL_ENTRY)&_ZN8S10102C22v6Ev,
  (VTBL_ENTRY)&_ZN8S10102C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10102C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10102C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10102C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10102C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10102C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10102C1D1Ev,_ZThn4_N8S10102C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10102C1D0Ev,_ZThn4_N8S10102C1D0Ev),
  (VTBL_ENTRY)&_ZN8S10102C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10102C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10102C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10102C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10102C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10102C1[];
extern  VTBL_ENTRY _ZTV8S10102C1[];
Class_Descriptor cd_S10102C1 = {  "S10102C1", // class name
  bases_S10102C1, 2,
  &(vtc_S10102C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8592,5920), // object size
  NSPAIRA(_ZTI8S10102C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10102C1),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10104C2  {
  virtual  ~S10104C2(); // _ZN8S10104C2D1Ev
  virtual void  v6(); // _ZN8S10104C22v6Ev
  S10104C2(); // tgen
};
//SIG(-1 S10104C2) C1{ vd v1}


 S10104C2 ::~S10104C2(){ note_dtor("S10104C2", this);}
void  S10104C2 ::v6(){vfunc_called(this, "_ZN8S10104C22v6Ev");}
S10104C2 ::S10104C2(){ note_ctor("S10104C2", this);} // tgen

static void Test_S10104C2()
{
  extern Class_Descriptor cd_S10104C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S10104C2, buf);
    S10104C2 *dp, &lv = *(dp=new (buf) S10104C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10104C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10104C2)");
    test_class_info(&lv, &cd_S10104C2);
    dp->~S10104C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10104C2(Test_S10104C2, "S10104C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S10104C2C1Ev();
extern void _ZN8S10104C2D1Ev();
Name_Map name_map_S10104C2[] = {
  NSPAIR(_ZN8S10104C2C1Ev),
  NSPAIR(_ZN8S10104C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10104C2[];
extern void _ZN8S10104C2D1Ev();
extern void _ZN8S10104C2D0Ev();
extern void _ZN8S10104C22v6Ev();
static  VTBL_ENTRY vtc_S10104C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10104C2[0]),
  (VTBL_ENTRY)&_ZN8S10104C2D1Ev,
  (VTBL_ENTRY)&_ZN8S10104C2D0Ev,
  (VTBL_ENTRY)&_ZN8S10104C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10104C2[];
extern  VTBL_ENTRY _ZTV8S10104C2[];
Class_Descriptor cd_S10104C2 = {  "S10104C2", // class name
  0,0,//no base classes
  &(vtc_S10104C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S10104C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10104C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10104C3  {
  void *s10104c3f0;
  virtual  ~S10104C3(); // _ZN8S10104C3D1Ev
  virtual void  v7(); // _ZN8S10104C32v7Ev
  virtual void  v8(); // _ZN8S10104C32v8Ev
  virtual void  v9(); // _ZN8S10104C32v9Ev
  virtual void  v10(); // _ZN8S10104C33v10Ev
  virtual void  v11(); // _ZN8S10104C33v11Ev
  S10104C3(); // tgen
};
//SIG(-1 S10104C3) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10104C3 ::~S10104C3(){ note_dtor("S10104C3", this);}
void  S10104C3 ::v7(){vfunc_called(this, "_ZN8S10104C32v7Ev");}
void  S10104C3 ::v8(){vfunc_called(this, "_ZN8S10104C32v8Ev");}
void  S10104C3 ::v9(){vfunc_called(this, "_ZN8S10104C32v9Ev");}
void  S10104C3 ::v10(){vfunc_called(this, "_ZN8S10104C33v10Ev");}
void  S10104C3 ::v11(){vfunc_called(this, "_ZN8S10104C33v11Ev");}
S10104C3 ::S10104C3(){ note_ctor("S10104C3", this);} // tgen

static void Test_S10104C3()
{
  extern Class_Descriptor cd_S10104C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_S10104C3, buf);
    S10104C3 *dp, &lv = *(dp=new (buf) S10104C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S10104C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10104C3)");
    check_field_offset(lv, s10104c3f0, ABISELECT(8,4), "S10104C3.s10104c3f0");
    test_class_info(&lv, &cd_S10104C3);
    dp->~S10104C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10104C3(Test_S10104C3, "S10104C3", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN8S10104C3C1Ev();
extern void _ZN8S10104C3D1Ev();
Name_Map name_map_S10104C3[] = {
  NSPAIR(_ZN8S10104C3C1Ev),
  NSPAIR(_ZN8S10104C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10104C3[];
extern void _ZN8S10104C3D1Ev();
extern void _ZN8S10104C3D0Ev();
extern void _ZN8S10104C32v7Ev();
extern void _ZN8S10104C32v8Ev();
extern void _ZN8S10104C32v9Ev();
extern void _ZN8S10104C33v10Ev();
extern void _ZN8S10104C33v11Ev();
static  VTBL_ENTRY vtc_S10104C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10104C3[0]),
  (VTBL_ENTRY)&_ZN8S10104C3D1Ev,
  (VTBL_ENTRY)&_ZN8S10104C3D0Ev,
  (VTBL_ENTRY)&_ZN8S10104C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10104C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10104C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10104C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10104C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10104C3[];
extern  VTBL_ENTRY _ZTV8S10104C3[];
Class_Descriptor cd_S10104C3 = {  "S10104C3", // class name
  0,0,//no base classes
  &(vtc_S10104C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI8S10104C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10104C3),9, //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

struct  S10104C12  {
  void *s10104c12f0;
  ::S10103C13_nt s10104c12f1;
  ::S10103C16_nt s10104c12f2;
  ::S10103C17 s10104c12f3;
  virtual  ~S10104C12(); // _ZN9S10104C12D1Ev
  virtual void  v14(); // _ZN9S10104C123v14Ev
  virtual void  v15(); // _ZN9S10104C123v15Ev
  virtual void  v16(); // _ZN9S10104C123v16Ev
  virtual void  v17(); // _ZN9S10104C123v17Ev
  virtual void  v18(); // _ZN9S10104C123v18Ev
  virtual void  v19(); // _ZN9S10104C123v19Ev
  virtual void  v20(); // _ZN9S10104C123v20Ev
  virtual void  v21(); // _ZN9S10104C123v21Ev
  virtual void  v22(); // _ZN9S10104C123v22Ev
  virtual void  v23(); // _ZN9S10104C123v23Ev
  virtual void  v24(); // _ZN9S10104C123v24Ev
  virtual void  v25(); // _ZN9S10104C123v25Ev
  virtual void  v26(); // _ZN9S10104C123v26Ev
  virtual void  v27(); // _ZN9S10104C123v27Ev
  virtual void  v28(); // _ZN9S10104C123v28Ev
  virtual void  v29(); // _ZN9S10104C123v29Ev
  virtual void  v30(); // _ZN9S10104C123v30Ev
  virtual void  v31(); // _ZN9S10104C123v31Ev
  virtual void  v32(); // _ZN9S10104C123v32Ev
  virtual void  v33(); // _ZN9S10104C123v33Ev
  virtual void  v34(); // _ZN9S10104C123v34Ev
  virtual void  v35(); // _ZN9S10104C123v35Ev
  virtual void  v36(); // _ZN9S10104C123v36Ev
  virtual void  v37(); // _ZN9S10104C123v37Ev
  S10104C12(); // tgen
};
//SIG(-1 S10104C12) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S10104C12 ::~S10104C12(){ note_dtor("S10104C12", this);}
void  S10104C12 ::v14(){vfunc_called(this, "_ZN9S10104C123v14Ev");}
void  S10104C12 ::v15(){vfunc_called(this, "_ZN9S10104C123v15Ev");}
void  S10104C12 ::v16(){vfunc_called(this, "_ZN9S10104C123v16Ev");}
void  S10104C12 ::v17(){vfunc_called(this, "_ZN9S10104C123v17Ev");}
void  S10104C12 ::v18(){vfunc_called(this, "_ZN9S10104C123v18Ev");}
void  S10104C12 ::v19(){vfunc_called(this, "_ZN9S10104C123v19Ev");}
void  S10104C12 ::v20(){vfunc_called(this, "_ZN9S10104C123v20Ev");}
void  S10104C12 ::v21(){vfunc_called(this, "_ZN9S10104C123v21Ev");}
void  S10104C12 ::v22(){vfunc_called(this, "_ZN9S10104C123v22Ev");}
void  S10104C12 ::v23(){vfunc_called(this, "_ZN9S10104C123v23Ev");}
void  S10104C12 ::v24(){vfunc_called(this, "_ZN9S10104C123v24Ev");}
void  S10104C12 ::v25(){vfunc_called(this, "_ZN9S10104C123v25Ev");}
void  S10104C12 ::v26(){vfunc_called(this, "_ZN9S10104C123v26Ev");}
void  S10104C12 ::v27(){vfunc_called(this, "_ZN9S10104C123v27Ev");}
void  S10104C12 ::v28(){vfunc_called(this, "_ZN9S10104C123v28Ev");}
void  S10104C12 ::v29(){vfunc_called(this, "_ZN9S10104C123v29Ev");}
void  S10104C12 ::v30(){vfunc_called(this, "_ZN9S10104C123v30Ev");}
void  S10104C12 ::v31(){vfunc_called(this, "_ZN9S10104C123v31Ev");}
void  S10104C12 ::v32(){vfunc_called(this, "_ZN9S10104C123v32Ev");}
void  S10104C12 ::v33(){vfunc_called(this, "_ZN9S10104C123v33Ev");}
void  S10104C12 ::v34(){vfunc_called(this, "_ZN9S10104C123v34Ev");}
void  S10104C12 ::v35(){vfunc_called(this, "_ZN9S10104C123v35Ev");}
void  S10104C12 ::v36(){vfunc_called(this, "_ZN9S10104C123v36Ev");}
void  S10104C12 ::v37(){vfunc_called(this, "_ZN9S10104C123v37Ev");}
S10104C12 ::S10104C12(){ note_ctor("S10104C12", this);} // tgen

static void Test_S10104C12()
{
  extern Class_Descriptor cd_S10104C12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S10104C12, buf);
    S10104C12 *dp, &lv = *(dp=new (buf) S10104C12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S10104C12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10104C12)");
    check_field_offset(lv, s10104c12f0, ABISELECT(8,4), "S10104C12.s10104c12f0");
    check_field_offset(lv, s10104c12f1, ABISELECT(16,8), "S10104C12.s10104c12f1");
    check_field_offset(lv, s10104c12f2, ABISELECT(40,24), "S10104C12.s10104c12f2");
    check_field_offset(lv, s10104c12f3, ABISELECT(96,64), "S10104C12.s10104c12f3");
    test_class_info(&lv, &cd_S10104C12);
    dp->~S10104C12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10104C12(Test_S10104C12, "S10104C12", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN9S10104C12C1Ev();
extern void _ZN9S10104C12D1Ev();
Name_Map name_map_S10104C12[] = {
  NSPAIR(_ZN9S10104C12C1Ev),
  NSPAIR(_ZN9S10104C12D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10104C12[];
extern void _ZN9S10104C12D1Ev();
extern void _ZN9S10104C12D0Ev();
extern void _ZN9S10104C123v14Ev();
extern void _ZN9S10104C123v15Ev();
extern void _ZN9S10104C123v16Ev();
extern void _ZN9S10104C123v17Ev();
extern void _ZN9S10104C123v18Ev();
extern void _ZN9S10104C123v19Ev();
extern void _ZN9S10104C123v20Ev();
extern void _ZN9S10104C123v21Ev();
extern void _ZN9S10104C123v22Ev();
extern void _ZN9S10104C123v23Ev();
extern void _ZN9S10104C123v24Ev();
extern void _ZN9S10104C123v25Ev();
extern void _ZN9S10104C123v26Ev();
extern void _ZN9S10104C123v27Ev();
extern void _ZN9S10104C123v28Ev();
extern void _ZN9S10104C123v29Ev();
extern void _ZN9S10104C123v30Ev();
extern void _ZN9S10104C123v31Ev();
extern void _ZN9S10104C123v32Ev();
extern void _ZN9S10104C123v33Ev();
extern void _ZN9S10104C123v34Ev();
extern void _ZN9S10104C123v35Ev();
extern void _ZN9S10104C123v36Ev();
extern void _ZN9S10104C123v37Ev();
static  VTBL_ENTRY vtc_S10104C12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10104C12[0]),
  (VTBL_ENTRY)&_ZN9S10104C12D1Ev,
  (VTBL_ENTRY)&_ZN9S10104C12D0Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v37Ev,
};
extern VTBL_ENTRY _ZTI9S10104C12[];
extern  VTBL_ENTRY _ZTV9S10104C12[];
Class_Descriptor cd_S10104C12 = {  "S10104C12", // class name
  0,0,//no base classes
  &(vtc_S10104C12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI9S10104C12),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10104C12),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10104C22_nt  {
  __tsi64 s10104c22f0[4];
  void  mf10104c22(); // _ZN12S10104C22_nt10mf10104c22Ev
};
//SIG(-1 S10104C22_nt) C1{ m FL[4]}


void  S10104C22_nt ::mf10104c22(){}

//skip512 S10104C22_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10104C19  {
  int s10104c19f0;
  ::S10103C106 s10104c19f1;
  ::S10104C22_nt s10104c19f2;
  void  mf10104c19(); // _ZN9S10104C1910mf10104c19Ev
  virtual  ~S10104C19(); // _ZN9S10104C19D1Ev
  S10104C19(); // tgen
};
//SIG(-1 S10104C19) C1{ vd m Fi FC2{ m Fp Fi[2] FC3{ m}} FC4{ m FL[4]}}


void  S10104C19 ::mf10104c19(){}
 S10104C19 ::~S10104C19(){ note_dtor("S10104C19", this);}
S10104C19 ::S10104C19(){ note_ctor("S10104C19", this);} // tgen

static void Test_S10104C19()
{
  extern Class_Descriptor cd_S10104C19;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,15)];
    init_test(&cd_S10104C19, buf);
    S10104C19 *dp, &lv = *(dp=new (buf) S10104C19());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,56), "sizeof(S10104C19)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10104C19)");
    check_field_offset(lv, s10104c19f0, ABISELECT(8,4), "S10104C19.s10104c19f0");
    check_field_offset(lv, s10104c19f1, ABISELECT(16,8), "S10104C19.s10104c19f1");
    check_field_offset(lv, s10104c19f2, ABISELECT(40,24), "S10104C19.s10104c19f2");
    test_class_info(&lv, &cd_S10104C19);
    dp->~S10104C19();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10104C19(Test_S10104C19, "S10104C19", ABISELECT(72,56));

#else // __cplusplus

extern void _ZN9S10104C19C1Ev();
extern void _ZN9S10104C19D1Ev();
Name_Map name_map_S10104C19[] = {
  NSPAIR(_ZN9S10104C19C1Ev),
  NSPAIR(_ZN9S10104C19D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10104C19[];
extern void _ZN9S10104C19D1Ev();
extern void _ZN9S10104C19D0Ev();
static  VTBL_ENTRY vtc_S10104C19[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10104C19[0]),
  (VTBL_ENTRY)&_ZN9S10104C19D1Ev,
  (VTBL_ENTRY)&_ZN9S10104C19D0Ev,
};
extern VTBL_ENTRY _ZTI9S10104C19[];
extern  VTBL_ENTRY _ZTV9S10104C19[];
Class_Descriptor cd_S10104C19 = {  "S10104C19", // class name
  0,0,//no base classes
  &(vtc_S10104C19[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,56), // object size
  NSPAIRA(_ZTI9S10104C19),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10104C19),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10104C4  : S10103C5_nt , S10104C12 {
  int s10104c4f0;
  void *s10104c4f1[8];
  int s10104c4f2[2];
  ::S10103C18 s10104c4f3;
  int s10104c4f4[4];
  char s10104c4f5;
  ::S10104C19 s10104c4f6;
  void *s10104c4f7;
  virtual  ~S10104C4(); // _ZN8S10104C4D1Ev
  virtual void  v12(); // _ZN8S10104C43v12Ev
  virtual void  v13(); // _ZN8S10104C43v13Ev
  S10104C4(); // tgen
};
//SIG(-1 S10104C4) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 Fi Fp[8] Fi[2] FC11{ Fi[11]} Fi[4] Fc FC12{ vd m Fi FC13{ m Fp Fi[2] FC14{ m}} FC15{ m FL[4]}} Fp}


 S10104C4 ::~S10104C4(){ note_dtor("S10104C4", this);}
void  S10104C4 ::v12(){vfunc_called(this, "_ZN8S10104C43v12Ev");}
void  S10104C4 ::v13(){vfunc_called(this, "_ZN8S10104C43v13Ev");}
S10104C4 ::S10104C4(){ note_ctor("S10104C4", this);} // tgen

static void Test_S10104C4()
{
  extern Class_Descriptor cd_S10104C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(50,71)];
    init_test(&cd_S10104C4, buf);
    S10104C4 *dp, &lv = *(dp=new (buf) S10104C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(392,280), "sizeof(S10104C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10104C4)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10104C4");
    check_base_class_offset(lv, (S10104C12*), ABISELECT(48,32), "S10104C4");
    check_field_offset(lv, s10104c4f0, ABISELECT(168,112), "S10104C4.s10104c4f0");
    check_field_offset(lv, s10104c4f1, ABISELECT(176,116), "S10104C4.s10104c4f1");
    check_field_offset(lv, s10104c4f2, ABISELECT(240,148), "S10104C4.s10104c4f2");
    check_field_offset(lv, s10104c4f3, ABISELECT(248,156), "S10104C4.s10104c4f3");
    check_field_offset(lv, s10104c4f4, ABISELECT(292,200), "S10104C4.s10104c4f4");
    check_field_offset(lv, s10104c4f5, ABISELECT(308,216), "S10104C4.s10104c4f5");
    check_field_offset(lv, s10104c4f6, ABISELECT(312,220), "S10104C4.s10104c4f6");
    check_field_offset(lv, s10104c4f7, ABISELECT(384,276), "S10104C4.s10104c4f7");
    test_class_info(&lv, &cd_S10104C4);
    dp->~S10104C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10104C4(Test_S10104C4, "S10104C4", ABISELECT(392,280));

#else // __cplusplus

extern void _ZN8S10104C4C1Ev();
extern void _ZN8S10104C4D1Ev();
Name_Map name_map_S10104C4[] = {
  NSPAIR(_ZN8S10104C4C1Ev),
  NSPAIR(_ZN8S10104C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10104C12;
extern VTBL_ENTRY _ZTI9S10104C12[];
extern  VTBL_ENTRY _ZTV9S10104C12[];
static Base_Class bases_S10104C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10104C12,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10104C4[];
extern void _ZN8S10104C4D1Ev();
extern void _ZN8S10104C4D0Ev();
extern void _ZN8S10104C43v12Ev();
extern void _ZN8S10104C43v13Ev();
extern void ABISELECT(_ZThn48_N8S10104C4D1Ev,_ZThn32_N8S10104C4D1Ev)();
extern void ABISELECT(_ZThn48_N8S10104C4D0Ev,_ZThn32_N8S10104C4D0Ev)();
extern void _ZN9S10104C123v14Ev();
extern void _ZN9S10104C123v15Ev();
extern void _ZN9S10104C123v16Ev();
extern void _ZN9S10104C123v17Ev();
extern void _ZN9S10104C123v18Ev();
extern void _ZN9S10104C123v19Ev();
extern void _ZN9S10104C123v20Ev();
extern void _ZN9S10104C123v21Ev();
extern void _ZN9S10104C123v22Ev();
extern void _ZN9S10104C123v23Ev();
extern void _ZN9S10104C123v24Ev();
extern void _ZN9S10104C123v25Ev();
extern void _ZN9S10104C123v26Ev();
extern void _ZN9S10104C123v27Ev();
extern void _ZN9S10104C123v28Ev();
extern void _ZN9S10104C123v29Ev();
extern void _ZN9S10104C123v30Ev();
extern void _ZN9S10104C123v31Ev();
extern void _ZN9S10104C123v32Ev();
extern void _ZN9S10104C123v33Ev();
extern void _ZN9S10104C123v34Ev();
extern void _ZN9S10104C123v35Ev();
extern void _ZN9S10104C123v36Ev();
extern void _ZN9S10104C123v37Ev();
static  VTBL_ENTRY vtc_S10104C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10104C4[0]),
  (VTBL_ENTRY)&_ZN8S10104C4D1Ev,
  (VTBL_ENTRY)&_ZN8S10104C4D0Ev,
  (VTBL_ENTRY)&_ZN8S10104C43v12Ev,
  (VTBL_ENTRY)&_ZN8S10104C43v13Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8S10104C4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10104C4D1Ev,_ZThn32_N8S10104C4D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10104C4D0Ev,_ZThn32_N8S10104C4D0Ev),
  (VTBL_ENTRY)&_ZN9S10104C123v14Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v15Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v16Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v17Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v18Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v19Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v20Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v21Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v22Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v23Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v24Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v25Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v26Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v27Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v28Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v29Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v30Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v31Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v32Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v33Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v34Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v35Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v36Ev,
  (VTBL_ENTRY)&_ZN9S10104C123v37Ev,
};
extern VTBL_ENTRY _ZTI8S10104C4[];
extern  VTBL_ENTRY _ZTV8S10104C4[];
Class_Descriptor cd_S10104C4 = {  "S10104C4", // class name
  bases_S10104C4, 2,
  &(vtc_S10104C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(392,280), // object size
  NSPAIRA(_ZTI8S10104C4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10104C4),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10104C1  : S10104C2 , S10104C3 {
  ::S10104C4 s10104c1f0;
  void *s10104c1f1[2];
  ::S10103C24 s10104c1f2;
  ::S10103C26 s10104c1f3;
  ::S10103C27 s10104c1f4;
  ::S10103C32 s10104c1f5;
  ::S10103C33 s10104c1f6;
  ::S10103C34 s10104c1f7;
  ::S10103C38 s10104c1f8;
  ::S10103C39 s10104c1f9;
  ::S10103C49 s10104c1f10;
  ::S10103C45 s10104c1f11;
  ::S10103C45 s10104c1f12;
  ::S10103C40 s10104c1f13;
  ::S10103C56 s10104c1f14;
  ::S10103C56 s10104c1f15;
  ::S10103C56 s10104c1f16;
  ::S10103C56 s10104c1f17;
  ::S10103C47 s10104c1f18;
  ::S10102C49 s10104c1f19;
  ::S10103C50 s10104c1f20;
  ::S10103C51 s10104c1f21;
  ::S10103C52 s10104c1f22;
  ::S10103C53 s10104c1f23;
  ::S10103C55 s10104c1f24;
  ::S10103C61 s10104c1f25;
  ::S10103C104 s10104c1f26;
  ::S10103C58_nt s10104c1f27;
  int s10104c1f28;
  char s10104c1f29[2];
  void *s10104c1f30;
  ::S10103C108 s10104c1f31;
  ::S10103C110 s10104c1f32;
  void *s10104c1f33[3];
  char s10104c1f34;
  ::S10103C111_nt s10104c1f35;
  void *s10104c1f36;
  virtual  ~S10104C1(); // _ZN8S10104C1D1Ev
  virtual void  v1(); // _ZN8S10104C12v1Ev
  virtual void  v2(); // _ZN8S10104C12v2Ev
  virtual void  v3(); // _ZN8S10104C12v3Ev
  virtual void  v4(); // _ZN8S10104C12v4Ev
  virtual void  v5(); // _ZN8S10104C12v5Ev
  S10104C1(); // tgen
};
//SIG(1 S10104C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 FC4{ BC5{ vd m FC6{ m Fp Fi FC7{ m} FC7} FC6 Fc} BC8{ vd v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 Fp FC9{ m FC10{ m Fp Fi FC11{ m}} Fi} FC12{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC13{ m Fc Fi[2] Fp}} vd v12 v13 Fi Fp[8] Fi[2] FC14{ Fi[11]} Fi[4] Fc FC15{ vd m Fi FC16{ m Fp Fi[2] FC17{ m}} FC18{ m FL[4]}} Fp} Fp[2] FC19{ BC5 BC20{ vd v40 v41 v42 v43 v44 v45 v46 v47 v48 v49 v50 v51 v52 v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 v63 Fp FC9 FC12 FC13} vd v38 v39 FC21{ Fi[4]}[2] FC21[2] FC21[2] FC21[2]} FC22{ BC5 BC20 vd v64 v65 v66 v67 Fp[2] Fc FC21[2] FC21[2] FC21[2] FC21[2]} FC23{ BC24{ BC5 BC20 vd v71 v72 v73 v74 v75 v76 v77 v78 v79} vd v68 v69 v70 Fi[2] FC25{ m Fi Fp Fi Fp[2] Fi} FC10 FC10 FC10 FC10 FC26{ m FC27{ m FL}} FL Fi Fp Fi Fc} FC28{ BC24 vd v80 v81 v82 FC25 FC10 FC10 Fp Fi} FC29{ BC5 BC20 vd v83 v84 v85 Fp} FC30{ BC5 BC20 vd v86 v87 Fp FC31{ m Fp Fi FC32{ m} FC32} FC10 FC10 Fi[2] Fc Fi[2]} FC33{ BC5 vd Fc Fp[2]} FC34{ BC5 BC20 vd v88 v89 v90 v91 v92 Fc} FC35{ BC36{ BC5 vd v95 v96 v97 v98 FC37{ m Fp FC9 FC10 FC10 Fi} Fp Fc Fi} v93 v94} FC38{ BC36 v99 v100 FC10} FC38 FC39{ BC36 v101 v102} FC40{ BC36 v103} FC40 FC40 FC40 FC41{ BC36 v104} FC42{ BC43{ BC5 vd v107 v108 v109 v110 FC37 Fp Fc Fi} v105 v106} FC44{ BC5 vd} FC45{ BC5 vd Fp[4]} FC46{ BC5 vd v111 v112 Fp[2] Fi[2]} FC47{ vd m Fp FC48{ m Fp} Fp Fi Fp} FC49{ BC50{ vd v118} BC51{ vd v119 v120 v121 v122 v123 Fp} vd v113 v114 v115 v116 v117 FC40 FC40 FC40 FC41 FC52{ BC36 v124 v125 v126 Fp} FC39 Fp[2] FC53{ m FC54{ m Fp Fi[2] FC11} Fp[2]}} FC55{ BC50 BC51 vd v127 v128 v129 v130 v131 Fp FC56{ BC5 BC20 vd v132 v133 v134 v135 v136 v137 v138 v139 v140 v141 v142 v143 v144 FC48 FC57{ m Fp} FC57 Fi[2] FC58{ BC59{ vd v145 v146} FC10 Fi FL[2] Fi} Fp FC60{ m Fp[2] FC61{ vd v147 v148 FC62{ m Fp Fi[2] FC63{ m}} FC64{ m Fi[4]}[3] Fp[2] Fi Fc} Fp[2]} Fc FC65{ BC66{ BC67{ BC68{ vd v153 v154 v155 v156 v157 v158 v159 v160 v161 v162 Fp[2] FC9 Fp} vd v163 v164 v165 v166 v167 v168 v169 v170 v171 v172 v173 v174 v175 v176 FC31 FC62 FC69{ m FC70{ m FL[2]}} FC9} v177 v178 v179 v180 FC71{ BC72{ BC68 vd v185 v186 v187 v188 v189 v190 Fp Fi FC73{ m Fp Fi FC63 FC17} FC69 Fi} vd v181 v182 v183 v184 FC9[4] FC69 FC69 FC69 FC69 Fi[6]} FC69 FC69} v149 v150 v151 v152 FC26 FC69} FC74{ BC68 vd v191 v192 v193 v194 v195 v196 Fp[2] FC69 FC69 FC69 Fi[13] Fp[3] Fi[3]} FC21[2] FC21[2] FC69 FC75{ vd m Fp[2] FC73 FC76{ vd m FL[2] Fi FC10 FC10 FC10 FC10 FC48}} FC9 Fp[2] FC9 Fp[3] Fc} FC41 FC39 FC77{ BC78{ BC5 BC20 vd v200 v201 v202 FC76 FL Fi} vd v197 v198 v199} FC77 FC79{ BC5 BC20 vd v203 v204 v205 v206 v207 v208 v209 v210 FC60 FC48 Fp} FC80{ BC24 BC50 vd v211 v212 v213 v214 v215 v216 Fi Fp Fi FC25} FC81{ BC20 vd v217 v218 v219 v220} FC76 FC40 FC40 Fp} FC82{ vd m Fc FC83{ m Fp} FC16} FC53 Fi Fc[2] Fp FC84{ BC85{} vd Fp[2] FC10 FC10 FC10 FC10 FC10 FL Fi FC26 FC26 Fi[2] FC48 Fi Fc Fi Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1 Fc:1} FC86{ BC85 FC10 FC10} Fp[3] Fc FC87{ m Fp[2]} Fp}


 S10104C1 ::~S10104C1(){ note_dtor("S10104C1", this);}
void  S10104C1 ::v1(){vfunc_called(this, "_ZN8S10104C12v1Ev");}
void  S10104C1 ::v2(){vfunc_called(this, "_ZN8S10104C12v2Ev");}
void  S10104C1 ::v3(){vfunc_called(this, "_ZN8S10104C12v3Ev");}
void  S10104C1 ::v4(){vfunc_called(this, "_ZN8S10104C12v4Ev");}
void  S10104C1 ::v5(){vfunc_called(this, "_ZN8S10104C12v5Ev");}
S10104C1 ::S10104C1(){ note_ctor("S10104C1", this);} // tgen

static void Test_S10104C1()
{
  extern Class_Descriptor cd_S10104C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(1075,1485)];
    init_test(&cd_S10104C1, buf);
    S10104C1 *dp, &lv = *(dp=new (buf) S10104C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8592,5936), "sizeof(S10104C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10104C1)");
    check_base_class_offset(lv, (S10104C2*), 0, "S10104C1");
    check_base_class_offset(lv, (S10104C3*), ABISELECT(8,4), "S10104C1");
    check_field_offset(lv, s10104c1f0, ABISELECT(24,12), "S10104C1.s10104c1f0");
    check_field_offset(lv, s10104c1f1, ABISELECT(416,292), "S10104C1.s10104c1f1");
    check_field_offset(lv, s10104c1f2, ABISELECT(432,300), "S10104C1.s10104c1f2");
    check_field_offset(lv, s10104c1f3, ABISELECT(728,540), "S10104C1.s10104c1f3");
    check_field_offset(lv, s10104c1f4, ABISELECT(1048,792), "S10104C1.s10104c1f4");
    check_field_offset(lv, s10104c1f5, ABISELECT(1376,1016), "S10104C1.s10104c1f5");
    check_field_offset(lv, s10104c1f6, ABISELECT(1640,1184), "S10104C1.s10104c1f6");
    check_field_offset(lv, s10104c1f7, ABISELECT(1816,1300), "S10104C1.s10104c1f7");
    check_field_offset(lv, s10104c1f8, ABISELECT(2064,1472), "S10104C1.s10104c1f8");
    check_field_offset(lv, s10104c1f9, ABISELECT(2128,1512), "S10104C1.s10104c1f9");
    check_field_offset(lv, s10104c1f10, ABISELECT(2304,1628), "S10104C1.s10104c1f10");
    check_field_offset(lv, s10104c1f11, ABISELECT(2440,1720), "S10104C1.s10104c1f11");
    check_field_offset(lv, s10104c1f12, ABISELECT(2592,1824), "S10104C1.s10104c1f12");
    check_field_offset(lv, s10104c1f13, ABISELECT(2744,1928), "S10104C1.s10104c1f13");
    check_field_offset(lv, s10104c1f14, ABISELECT(2880,2020), "S10104C1.s10104c1f14");
    check_field_offset(lv, s10104c1f15, ABISELECT(3016,2112), "S10104C1.s10104c1f15");
    check_field_offset(lv, s10104c1f16, ABISELECT(3152,2204), "S10104C1.s10104c1f16");
    check_field_offset(lv, s10104c1f17, ABISELECT(3288,2296), "S10104C1.s10104c1f17");
    check_field_offset(lv, s10104c1f18, ABISELECT(3424,2388), "S10104C1.s10104c1f18");
    check_field_offset(lv, s10104c1f19, ABISELECT(3560,2480), "S10104C1.s10104c1f19");
    check_field_offset(lv, s10104c1f20, ABISELECT(3696,2572), "S10104C1.s10104c1f20");
    check_field_offset(lv, s10104c1f21, ABISELECT(3744,2604), "S10104C1.s10104c1f21");
    check_field_offset(lv, s10104c1f22, ABISELECT(3824,2652), "S10104C1.s10104c1f22");
    check_field_offset(lv, s10104c1f23, ABISELECT(3896,2700), "S10104C1.s10104c1f23");
    check_field_offset(lv, s10104c1f24, ABISELECT(3944,2724), "S10104C1.s10104c1f24");
    check_field_offset(lv, s10104c1f25, ABISELECT(4848,3324), "S10104C1.s10104c1f25");
    check_field_offset(lv, s10104c1f26, ABISELECT(8232,5692), "S10104C1.s10104c1f26");
    check_field_offset(lv, s10104c1f27, ABISELECT(8280,5720), "S10104C1.s10104c1f27");
    check_field_offset(lv, s10104c1f28, ABISELECT(8320,5744), "S10104C1.s10104c1f28");
    check_field_offset(lv, s10104c1f29, ABISELECT(8324,5748), "S10104C1.s10104c1f29");
    check_field_offset(lv, s10104c1f30, ABISELECT(8328,5752), "S10104C1.s10104c1f30");
    check_field_offset(lv, s10104c1f31, ABISELECT(8336,5756), "S10104C1.s10104c1f31");
    check_field_offset(lv, s10104c1f32, ABISELECT(8504,5884), "S10104C1.s10104c1f32");
    check_field_offset(lv, s10104c1f33, ABISELECT(8536,5908), "S10104C1.s10104c1f33");
    check_field_offset(lv, s10104c1f34, ABISELECT(8560,5920), "S10104C1.s10104c1f34");
    check_field_offset(lv, s10104c1f35, ABISELECT(8568,5924), "S10104C1.s10104c1f35");
    check_field_offset(lv, s10104c1f36, ABISELECT(8584,5932), "S10104C1.s10104c1f36");
    test_class_info(&lv, &cd_S10104C1);
    dp->~S10104C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10104C1(Test_S10104C1, "S10104C1", ABISELECT(8592,5936));

#else // __cplusplus

extern void _ZN8S10104C1C1Ev();
extern void _ZN8S10104C1D1Ev();
Name_Map name_map_S10104C1[] = {
  NSPAIR(_ZN8S10104C1C1Ev),
  NSPAIR(_ZN8S10104C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10104C2;
extern VTBL_ENTRY _ZTI8S10104C2[];
extern  VTBL_ENTRY _ZTV8S10104C2[];
extern Class_Descriptor cd_S10104C3;
extern VTBL_ENTRY _ZTI8S10104C3[];
extern  VTBL_ENTRY _ZTV8S10104C3[];
static Base_Class bases_S10104C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10104C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10104C3,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10104C1[];
extern void _ZN8S10104C1D1Ev();
extern void _ZN8S10104C1D0Ev();
extern void _ZN8S10104C22v6Ev();
extern void _ZN8S10104C12v1Ev();
extern void _ZN8S10104C12v2Ev();
extern void _ZN8S10104C12v3Ev();
extern void _ZN8S10104C12v4Ev();
extern void _ZN8S10104C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10104C1D1Ev,_ZThn4_N8S10104C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10104C1D0Ev,_ZThn4_N8S10104C1D0Ev)();
extern void _ZN8S10104C32v7Ev();
extern void _ZN8S10104C32v8Ev();
extern void _ZN8S10104C32v9Ev();
extern void _ZN8S10104C33v10Ev();
extern void _ZN8S10104C33v11Ev();
static  VTBL_ENTRY vtc_S10104C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10104C1[0]),
  (VTBL_ENTRY)&_ZN8S10104C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10104C1D0Ev,
  (VTBL_ENTRY)&_ZN8S10104C22v6Ev,
  (VTBL_ENTRY)&_ZN8S10104C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10104C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10104C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10104C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10104C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10104C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10104C1D1Ev,_ZThn4_N8S10104C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10104C1D0Ev,_ZThn4_N8S10104C1D0Ev),
  (VTBL_ENTRY)&_ZN8S10104C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10104C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10104C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10104C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10104C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10104C1[];
extern  VTBL_ENTRY _ZTV8S10104C1[];
Class_Descriptor cd_S10104C1 = {  "S10104C1", // class name
  bases_S10104C1, 2,
  &(vtc_S10104C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8592,5936), // object size
  NSPAIRA(_ZTI8S10104C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10104C1),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C2  {
  virtual  ~S10098C2(); // _ZN8S10098C2D1Ev
  virtual void  v6(); // _ZN8S10098C22v6Ev
  S10098C2(); // tgen
};
//SIG(-1 S10098C2) C1{ vd v1}


 S10098C2 ::~S10098C2(){ note_dtor("S10098C2", this);}
void  S10098C2 ::v6(){vfunc_called(this, "_ZN8S10098C22v6Ev");}
S10098C2 ::S10098C2(){ note_ctor("S10098C2", this);} // tgen

static void Test_S10098C2()
{
  extern Class_Descriptor cd_S10098C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S10098C2, buf);
    S10098C2 *dp, &lv = *(dp=new (buf) S10098C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10098C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C2)");
    test_class_info(&lv, &cd_S10098C2);
    dp->~S10098C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C2(Test_S10098C2, "S10098C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S10098C2C1Ev();
extern void _ZN8S10098C2D1Ev();
Name_Map name_map_S10098C2[] = {
  NSPAIR(_ZN8S10098C2C1Ev),
  NSPAIR(_ZN8S10098C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10098C2[];
extern void _ZN8S10098C2D1Ev();
extern void _ZN8S10098C2D0Ev();
extern void _ZN8S10098C22v6Ev();
static  VTBL_ENTRY vtc_S10098C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10098C2[0]),
  (VTBL_ENTRY)&_ZN8S10098C2D1Ev,
  (VTBL_ENTRY)&_ZN8S10098C2D0Ev,
  (VTBL_ENTRY)&_ZN8S10098C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10098C2[];
extern  VTBL_ENTRY _ZTV8S10098C2[];
Class_Descriptor cd_S10098C2 = {  "S10098C2", // class name
  0,0,//no base classes
  &(vtc_S10098C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S10098C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10098C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C3  {
  void *s10098c3f0;
  virtual  ~S10098C3(); // _ZN8S10098C3D1Ev
  virtual void  v7(); // _ZN8S10098C32v7Ev
  virtual void  v8(); // _ZN8S10098C32v8Ev
  virtual void  v9(); // _ZN8S10098C32v9Ev
  virtual void  v10(); // _ZN8S10098C33v10Ev
  virtual void  v11(); // _ZN8S10098C33v11Ev
  S10098C3(); // tgen
};
//SIG(-1 S10098C3) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10098C3 ::~S10098C3(){ note_dtor("S10098C3", this);}
void  S10098C3 ::v7(){vfunc_called(this, "_ZN8S10098C32v7Ev");}
void  S10098C3 ::v8(){vfunc_called(this, "_ZN8S10098C32v8Ev");}
void  S10098C3 ::v9(){vfunc_called(this, "_ZN8S10098C32v9Ev");}
void  S10098C3 ::v10(){vfunc_called(this, "_ZN8S10098C33v10Ev");}
void  S10098C3 ::v11(){vfunc_called(this, "_ZN8S10098C33v11Ev");}
S10098C3 ::S10098C3(){ note_ctor("S10098C3", this);} // tgen

static void Test_S10098C3()
{
  extern Class_Descriptor cd_S10098C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_S10098C3, buf);
    S10098C3 *dp, &lv = *(dp=new (buf) S10098C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S10098C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C3)");
    check_field_offset(lv, s10098c3f0, ABISELECT(8,4), "S10098C3.s10098c3f0");
    test_class_info(&lv, &cd_S10098C3);
    dp->~S10098C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C3(Test_S10098C3, "S10098C3", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN8S10098C3C1Ev();
extern void _ZN8S10098C3D1Ev();
Name_Map name_map_S10098C3[] = {
  NSPAIR(_ZN8S10098C3C1Ev),
  NSPAIR(_ZN8S10098C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10098C3[];
extern void _ZN8S10098C3D1Ev();
extern void _ZN8S10098C3D0Ev();
extern void _ZN8S10098C32v7Ev();
extern void _ZN8S10098C32v8Ev();
extern void _ZN8S10098C32v9Ev();
extern void _ZN8S10098C33v10Ev();
extern void _ZN8S10098C33v11Ev();
static  VTBL_ENTRY vtc_S10098C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10098C3[0]),
  (VTBL_ENTRY)&_ZN8S10098C3D1Ev,
  (VTBL_ENTRY)&_ZN8S10098C3D0Ev,
  (VTBL_ENTRY)&_ZN8S10098C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10098C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10098C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10098C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10098C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10098C3[];
extern  VTBL_ENTRY _ZTV8S10098C3[];
Class_Descriptor cd_S10098C3 = {  "S10098C3", // class name
  0,0,//no base classes
  &(vtc_S10098C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI8S10098C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10098C3),9, //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

struct  S10098C4  {
  void *s10098c4f0[4];
  int s10098c4f1;
  void  mf10098c4(); // _ZN8S10098C49mf10098c4Ev
  virtual  ~S10098C4(); // _ZN8S10098C4D1Ev
  S10098C4(); // tgen
};
//SIG(-1 S10098C4) C1{ vd m Fp[4] Fi}


void  S10098C4 ::mf10098c4(){}
 S10098C4 ::~S10098C4(){ note_dtor("S10098C4", this);}
S10098C4 ::S10098C4(){ note_ctor("S10098C4", this);} // tgen

static void Test_S10098C4()
{
  extern Class_Descriptor cd_S10098C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[7];
    init_test(&cd_S10098C4, buf);
    S10098C4 *dp, &lv = *(dp=new (buf) S10098C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(S10098C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C4)");
    check_field_offset(lv, s10098c4f0, ABISELECT(8,4), "S10098C4.s10098c4f0");
    check_field_offset(lv, s10098c4f1, ABISELECT(40,20), "S10098C4.s10098c4f1");
    test_class_info(&lv, &cd_S10098C4);
    dp->~S10098C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C4(Test_S10098C4, "S10098C4", ABISELECT(48,24));

#else // __cplusplus

extern void _ZN8S10098C4C1Ev();
extern void _ZN8S10098C4D1Ev();
Name_Map name_map_S10098C4[] = {
  NSPAIR(_ZN8S10098C4C1Ev),
  NSPAIR(_ZN8S10098C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10098C4[];
extern void _ZN8S10098C4D1Ev();
extern void _ZN8S10098C4D0Ev();
static  VTBL_ENTRY vtc_S10098C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10098C4[0]),
  (VTBL_ENTRY)&_ZN8S10098C4D1Ev,
  (VTBL_ENTRY)&_ZN8S10098C4D0Ev,
};
extern VTBL_ENTRY _ZTI8S10098C4[];
extern  VTBL_ENTRY _ZTV8S10098C4[];
Class_Descriptor cd_S10098C4 = {  "S10098C4", // class name
  0,0,//no base classes
  &(vtc_S10098C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,24), // object size
  NSPAIRA(_ZTI8S10098C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10098C4),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

struct  S10098C22  {
  void *s10098c22f0;
  ::S10103C13_nt s10098c22f1;
  ::S10103C16_nt s10098c22f2;
  ::S10103C17 s10098c22f3;
  virtual  ~S10098C22(); // _ZN9S10098C22D1Ev
  virtual void  v20(); // _ZN9S10098C223v20Ev
  virtual void  v21(); // _ZN9S10098C223v21Ev
  virtual void  v22(); // _ZN9S10098C223v22Ev
  virtual void  v23(); // _ZN9S10098C223v23Ev
  virtual void  v24(); // _ZN9S10098C223v24Ev
  virtual void  v25(); // _ZN9S10098C223v25Ev
  virtual void  v26(); // _ZN9S10098C223v26Ev
  virtual void  v27(); // _ZN9S10098C223v27Ev
  virtual void  v28(); // _ZN9S10098C223v28Ev
  virtual void  v29(); // _ZN9S10098C223v29Ev
  virtual void  v30(); // _ZN9S10098C223v30Ev
  virtual void  v31(); // _ZN9S10098C223v31Ev
  virtual void  v32(); // _ZN9S10098C223v32Ev
  virtual void  v33(); // _ZN9S10098C223v33Ev
  virtual void  v34(); // _ZN9S10098C223v34Ev
  virtual void  v35(); // _ZN9S10098C223v35Ev
  virtual void  v36(); // _ZN9S10098C223v36Ev
  virtual void  v37(); // _ZN9S10098C223v37Ev
  virtual void  v38(); // _ZN9S10098C223v38Ev
  virtual void  v39(); // _ZN9S10098C223v39Ev
  virtual void  v40(); // _ZN9S10098C223v40Ev
  virtual void  v41(); // _ZN9S10098C223v41Ev
  virtual void  v42(); // _ZN9S10098C223v42Ev
  virtual void  v43(); // _ZN9S10098C223v43Ev
  S10098C22(); // tgen
};
//SIG(-1 S10098C22) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S10098C22 ::~S10098C22(){ note_dtor("S10098C22", this);}
void  S10098C22 ::v20(){vfunc_called(this, "_ZN9S10098C223v20Ev");}
void  S10098C22 ::v21(){vfunc_called(this, "_ZN9S10098C223v21Ev");}
void  S10098C22 ::v22(){vfunc_called(this, "_ZN9S10098C223v22Ev");}
void  S10098C22 ::v23(){vfunc_called(this, "_ZN9S10098C223v23Ev");}
void  S10098C22 ::v24(){vfunc_called(this, "_ZN9S10098C223v24Ev");}
void  S10098C22 ::v25(){vfunc_called(this, "_ZN9S10098C223v25Ev");}
void  S10098C22 ::v26(){vfunc_called(this, "_ZN9S10098C223v26Ev");}
void  S10098C22 ::v27(){vfunc_called(this, "_ZN9S10098C223v27Ev");}
void  S10098C22 ::v28(){vfunc_called(this, "_ZN9S10098C223v28Ev");}
void  S10098C22 ::v29(){vfunc_called(this, "_ZN9S10098C223v29Ev");}
void  S10098C22 ::v30(){vfunc_called(this, "_ZN9S10098C223v30Ev");}
void  S10098C22 ::v31(){vfunc_called(this, "_ZN9S10098C223v31Ev");}
void  S10098C22 ::v32(){vfunc_called(this, "_ZN9S10098C223v32Ev");}
void  S10098C22 ::v33(){vfunc_called(this, "_ZN9S10098C223v33Ev");}
void  S10098C22 ::v34(){vfunc_called(this, "_ZN9S10098C223v34Ev");}
void  S10098C22 ::v35(){vfunc_called(this, "_ZN9S10098C223v35Ev");}
void  S10098C22 ::v36(){vfunc_called(this, "_ZN9S10098C223v36Ev");}
void  S10098C22 ::v37(){vfunc_called(this, "_ZN9S10098C223v37Ev");}
void  S10098C22 ::v38(){vfunc_called(this, "_ZN9S10098C223v38Ev");}
void  S10098C22 ::v39(){vfunc_called(this, "_ZN9S10098C223v39Ev");}
void  S10098C22 ::v40(){vfunc_called(this, "_ZN9S10098C223v40Ev");}
void  S10098C22 ::v41(){vfunc_called(this, "_ZN9S10098C223v41Ev");}
void  S10098C22 ::v42(){vfunc_called(this, "_ZN9S10098C223v42Ev");}
void  S10098C22 ::v43(){vfunc_called(this, "_ZN9S10098C223v43Ev");}
S10098C22 ::S10098C22(){ note_ctor("S10098C22", this);} // tgen

static void Test_S10098C22()
{
  extern Class_Descriptor cd_S10098C22;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S10098C22, buf);
    S10098C22 *dp, &lv = *(dp=new (buf) S10098C22());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S10098C22)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C22)");
    check_field_offset(lv, s10098c22f0, ABISELECT(8,4), "S10098C22.s10098c22f0");
    check_field_offset(lv, s10098c22f1, ABISELECT(16,8), "S10098C22.s10098c22f1");
    check_field_offset(lv, s10098c22f2, ABISELECT(40,24), "S10098C22.s10098c22f2");
    check_field_offset(lv, s10098c22f3, ABISELECT(96,64), "S10098C22.s10098c22f3");
    test_class_info(&lv, &cd_S10098C22);
    dp->~S10098C22();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C22(Test_S10098C22, "S10098C22", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN9S10098C22C1Ev();
extern void _ZN9S10098C22D1Ev();
Name_Map name_map_S10098C22[] = {
  NSPAIR(_ZN9S10098C22C1Ev),
  NSPAIR(_ZN9S10098C22D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10098C22[];
extern void _ZN9S10098C22D1Ev();
extern void _ZN9S10098C22D0Ev();
extern void _ZN9S10098C223v20Ev();
extern void _ZN9S10098C223v21Ev();
extern void _ZN9S10098C223v22Ev();
extern void _ZN9S10098C223v23Ev();
extern void _ZN9S10098C223v24Ev();
extern void _ZN9S10098C223v25Ev();
extern void _ZN9S10098C223v26Ev();
extern void _ZN9S10098C223v27Ev();
extern void _ZN9S10098C223v28Ev();
extern void _ZN9S10098C223v29Ev();
extern void _ZN9S10098C223v30Ev();
extern void _ZN9S10098C223v31Ev();
extern void _ZN9S10098C223v32Ev();
extern void _ZN9S10098C223v33Ev();
extern void _ZN9S10098C223v34Ev();
extern void _ZN9S10098C223v35Ev();
extern void _ZN9S10098C223v36Ev();
extern void _ZN9S10098C223v37Ev();
extern void _ZN9S10098C223v38Ev();
extern void _ZN9S10098C223v39Ev();
extern void _ZN9S10098C223v40Ev();
extern void _ZN9S10098C223v41Ev();
extern void _ZN9S10098C223v42Ev();
extern void _ZN9S10098C223v43Ev();
static  VTBL_ENTRY vtc_S10098C22[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C22[0]),
  (VTBL_ENTRY)&_ZN9S10098C22D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C22D0Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v20Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v21Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v22Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v23Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v24Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v25Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v26Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v27Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v28Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v29Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v30Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v31Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v32Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v33Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v34Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v35Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v36Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v37Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v38Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v39Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v40Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v41Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v42Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v43Ev,
};
extern VTBL_ENTRY _ZTI9S10098C22[];
extern  VTBL_ENTRY _ZTV9S10098C22[];
Class_Descriptor cd_S10098C22 = {  "S10098C22", // class name
  0,0,//no base classes
  &(vtc_S10098C22[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI9S10098C22),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10098C22),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C21  : S10103C5_nt , S10098C22 {
  virtual  ~S10098C21(); // _ZN9S10098C21D1Ev
  virtual void  v18(); // _ZN9S10098C213v18Ev
  virtual void  v19(); // _ZN9S10098C213v19Ev
  S10098C21(); // tgen
};
//SIG(-1 S10098C21) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2}


 S10098C21 ::~S10098C21(){ note_dtor("S10098C21", this);}
void  S10098C21 ::v18(){vfunc_called(this, "_ZN9S10098C213v18Ev");}
void  S10098C21 ::v19(){vfunc_called(this, "_ZN9S10098C213v19Ev");}
S10098C21 ::S10098C21(){ note_ctor("S10098C21", this);} // tgen

static void Test_S10098C21()
{
  extern Class_Descriptor cd_S10098C21;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(22,29)];
    init_test(&cd_S10098C21, buf);
    S10098C21 *dp, &lv = *(dp=new (buf) S10098C21());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(168,112), "sizeof(S10098C21)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C21)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10098C21");
    check_base_class_offset(lv, (S10098C22*), ABISELECT(48,32), "S10098C21");
    test_class_info(&lv, &cd_S10098C21);
    dp->~S10098C21();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C21(Test_S10098C21, "S10098C21", ABISELECT(168,112));

#else // __cplusplus

extern void _ZN9S10098C21C1Ev();
extern void _ZN9S10098C21D1Ev();
Name_Map name_map_S10098C21[] = {
  NSPAIR(_ZN9S10098C21C1Ev),
  NSPAIR(_ZN9S10098C21D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10098C22;
extern VTBL_ENTRY _ZTI9S10098C22[];
extern  VTBL_ENTRY _ZTV9S10098C22[];
static Base_Class bases_S10098C21[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10098C22,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10098C21[];
extern void _ZN9S10098C21D1Ev();
extern void _ZN9S10098C21D0Ev();
extern void _ZN9S10098C213v18Ev();
extern void _ZN9S10098C213v19Ev();
extern void ABISELECT(_ZThn48_N9S10098C21D1Ev,_ZThn32_N9S10098C21D1Ev)();
extern void ABISELECT(_ZThn48_N9S10098C21D0Ev,_ZThn32_N9S10098C21D0Ev)();
extern void _ZN9S10098C223v20Ev();
extern void _ZN9S10098C223v21Ev();
extern void _ZN9S10098C223v22Ev();
extern void _ZN9S10098C223v23Ev();
extern void _ZN9S10098C223v24Ev();
extern void _ZN9S10098C223v25Ev();
extern void _ZN9S10098C223v26Ev();
extern void _ZN9S10098C223v27Ev();
extern void _ZN9S10098C223v28Ev();
extern void _ZN9S10098C223v29Ev();
extern void _ZN9S10098C223v30Ev();
extern void _ZN9S10098C223v31Ev();
extern void _ZN9S10098C223v32Ev();
extern void _ZN9S10098C223v33Ev();
extern void _ZN9S10098C223v34Ev();
extern void _ZN9S10098C223v35Ev();
extern void _ZN9S10098C223v36Ev();
extern void _ZN9S10098C223v37Ev();
extern void _ZN9S10098C223v38Ev();
extern void _ZN9S10098C223v39Ev();
extern void _ZN9S10098C223v40Ev();
extern void _ZN9S10098C223v41Ev();
extern void _ZN9S10098C223v42Ev();
extern void _ZN9S10098C223v43Ev();
static  VTBL_ENTRY vtc_S10098C21[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C21[0]),
  (VTBL_ENTRY)&_ZN9S10098C21D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C21D0Ev,
  (VTBL_ENTRY)&_ZN9S10098C213v18Ev,
  (VTBL_ENTRY)&_ZN9S10098C213v19Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10098C21[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10098C21D1Ev,_ZThn32_N9S10098C21D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10098C21D0Ev,_ZThn32_N9S10098C21D0Ev),
  (VTBL_ENTRY)&_ZN9S10098C223v20Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v21Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v22Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v23Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v24Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v25Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v26Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v27Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v28Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v29Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v30Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v31Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v32Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v33Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v34Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v35Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v36Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v37Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v38Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v39Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v40Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v41Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v42Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v43Ev,
};
extern VTBL_ENTRY _ZTI9S10098C21[];
extern  VTBL_ENTRY _ZTV9S10098C21[];
Class_Descriptor cd_S10098C21 = {  "S10098C21", // class name
  bases_S10098C21, 2,
  &(vtc_S10098C21[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(168,112), // object size
  NSPAIRA(_ZTI9S10098C21),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10098C21),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C25  : S10103C5_nt , S10098C22 {
  int s10098c25f0;
  virtual  ~S10098C25(); // _ZN9S10098C25D1Ev
  virtual void  v44(); // _ZN9S10098C253v44Ev
  virtual void  v45(); // _ZN9S10098C253v45Ev
  virtual void  v46(); // _ZN9S10098C253v46Ev
  virtual void  v47(); // _ZN9S10098C253v47Ev
  virtual void  v48(); // _ZN9S10098C253v48Ev
  S10098C25(); // tgen
};
//SIG(-1 S10098C25) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 v5 Fi}


 S10098C25 ::~S10098C25(){ note_dtor("S10098C25", this);}
void  S10098C25 ::v44(){vfunc_called(this, "_ZN9S10098C253v44Ev");}
void  S10098C25 ::v45(){vfunc_called(this, "_ZN9S10098C253v45Ev");}
void  S10098C25 ::v46(){vfunc_called(this, "_ZN9S10098C253v46Ev");}
void  S10098C25 ::v47(){vfunc_called(this, "_ZN9S10098C253v47Ev");}
void  S10098C25 ::v48(){vfunc_called(this, "_ZN9S10098C253v48Ev");}
S10098C25 ::S10098C25(){ note_ctor("S10098C25", this);} // tgen

static void Test_S10098C25()
{
  extern Class_Descriptor cd_S10098C25;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(23,30)];
    init_test(&cd_S10098C25, buf);
    S10098C25 *dp, &lv = *(dp=new (buf) S10098C25());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(176,116), "sizeof(S10098C25)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C25)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10098C25");
    check_base_class_offset(lv, (S10098C22*), ABISELECT(48,32), "S10098C25");
    check_field_offset(lv, s10098c25f0, ABISELECT(168,112), "S10098C25.s10098c25f0");
    test_class_info(&lv, &cd_S10098C25);
    dp->~S10098C25();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C25(Test_S10098C25, "S10098C25", ABISELECT(176,116));

#else // __cplusplus

extern void _ZN9S10098C25C1Ev();
extern void _ZN9S10098C25D1Ev();
Name_Map name_map_S10098C25[] = {
  NSPAIR(_ZN9S10098C25C1Ev),
  NSPAIR(_ZN9S10098C25D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10098C22;
extern VTBL_ENTRY _ZTI9S10098C22[];
extern  VTBL_ENTRY _ZTV9S10098C22[];
static Base_Class bases_S10098C25[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10098C22,    ABISELECT(48,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10098C25[];
extern void _ZN9S10098C25D1Ev();
extern void _ZN9S10098C25D0Ev();
extern void _ZN9S10098C253v44Ev();
extern void _ZN9S10098C253v45Ev();
extern void _ZN9S10098C253v46Ev();
extern void _ZN9S10098C253v47Ev();
extern void _ZN9S10098C253v48Ev();
extern void ABISELECT(_ZThn48_N9S10098C25D1Ev,_ZThn32_N9S10098C25D1Ev)();
extern void ABISELECT(_ZThn48_N9S10098C25D0Ev,_ZThn32_N9S10098C25D0Ev)();
extern void _ZN9S10098C223v20Ev();
extern void _ZN9S10098C223v21Ev();
extern void _ZN9S10098C223v22Ev();
extern void _ZN9S10098C223v23Ev();
extern void _ZN9S10098C223v24Ev();
extern void _ZN9S10098C223v25Ev();
extern void _ZN9S10098C223v26Ev();
extern void _ZN9S10098C223v27Ev();
extern void _ZN9S10098C223v28Ev();
extern void _ZN9S10098C223v29Ev();
extern void _ZN9S10098C223v30Ev();
extern void _ZN9S10098C223v31Ev();
extern void _ZN9S10098C223v32Ev();
extern void _ZN9S10098C223v33Ev();
extern void _ZN9S10098C223v34Ev();
extern void _ZN9S10098C223v35Ev();
extern void _ZN9S10098C223v36Ev();
extern void _ZN9S10098C223v37Ev();
extern void _ZN9S10098C223v38Ev();
extern void _ZN9S10098C223v39Ev();
extern void _ZN9S10098C223v40Ev();
extern void _ZN9S10098C223v41Ev();
extern void _ZN9S10098C223v42Ev();
extern void _ZN9S10098C223v43Ev();
static  VTBL_ENTRY vtc_S10098C25[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C25[0]),
  (VTBL_ENTRY)&_ZN9S10098C25D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C25D0Ev,
  (VTBL_ENTRY)&_ZN9S10098C253v44Ev,
  (VTBL_ENTRY)&_ZN9S10098C253v45Ev,
  (VTBL_ENTRY)&_ZN9S10098C253v46Ev,
  (VTBL_ENTRY)&_ZN9S10098C253v47Ev,
  (VTBL_ENTRY)&_ZN9S10098C253v48Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI9S10098C25[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10098C25D1Ev,_ZThn32_N9S10098C25D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N9S10098C25D0Ev,_ZThn32_N9S10098C25D0Ev),
  (VTBL_ENTRY)&_ZN9S10098C223v20Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v21Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v22Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v23Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v24Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v25Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v26Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v27Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v28Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v29Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v30Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v31Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v32Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v33Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v34Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v35Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v36Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v37Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v38Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v39Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v40Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v41Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v42Ev,
  (VTBL_ENTRY)&_ZN9S10098C223v43Ev,
};
extern VTBL_ENTRY _ZTI9S10098C25[];
extern  VTBL_ENTRY _ZTV9S10098C25[];
Class_Descriptor cd_S10098C25 = {  "S10098C25", // class name
  bases_S10098C25, 2,
  &(vtc_S10098C25[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(176,116), // object size
  NSPAIRA(_ZTI9S10098C25),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV9S10098C25),37, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C6  : S10103C5_nt {
  ::S10103C42 s10098c6f0;
  void *s10098c6f1;
  char s10098c6f2;
  int s10098c6f3;
  virtual  ~S10098C6(); // _ZN8S10098C6D1Ev
  virtual void  v13(); // _ZN8S10098C63v13Ev
  virtual void  v14(); // _ZN8S10098C63v14Ev
  virtual void  v15(); // _ZN8S10098C63v15Ev
  virtual void  v16(); // _ZN8S10098C63v16Ev
  S10098C6(); // tgen
};
//SIG(-1 S10098C6) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd v1 v2 v3 v4 FC5{ m Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC7 FC7 Fi} Fp Fc Fi}


 S10098C6 ::~S10098C6(){ note_dtor("S10098C6", this);}
void  S10098C6 ::v13(){vfunc_called(this, "_ZN8S10098C63v13Ev");}
void  S10098C6 ::v14(){vfunc_called(this, "_ZN8S10098C63v14Ev");}
void  S10098C6 ::v15(){vfunc_called(this, "_ZN8S10098C63v15Ev");}
void  S10098C6 ::v16(){vfunc_called(this, "_ZN8S10098C63v16Ev");}
S10098C6 ::S10098C6(){ note_ctor("S10098C6", this);} // tgen

static void Test_S10098C6()
{
  extern Class_Descriptor cd_S10098C6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10098C6, buf);
    S10098C6 *dp, &lv = *(dp=new (buf) S10098C6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10098C6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C6)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10098C6");
    check_field_offset(lv, s10098c6f0, ABISELECT(48,32), "S10098C6.s10098c6f0");
    check_field_offset(lv, s10098c6f1, ABISELECT(120,80), "S10098C6.s10098c6f1");
    check_field_offset(lv, s10098c6f2, ABISELECT(128,84), "S10098C6.s10098c6f2");
    check_field_offset(lv, s10098c6f3, ABISELECT(132,88), "S10098C6.s10098c6f3");
    test_class_info(&lv, &cd_S10098C6);
    dp->~S10098C6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C6(Test_S10098C6, "S10098C6", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN8S10098C6C1Ev();
extern void _ZN8S10098C6D1Ev();
Name_Map name_map_S10098C6[] = {
  NSPAIR(_ZN8S10098C6C1Ev),
  NSPAIR(_ZN8S10098C6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10098C6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10098C6[];
extern void _ZN8S10098C6D1Ev();
extern void _ZN8S10098C6D0Ev();
extern void _ZN8S10098C63v13Ev();
extern void _ZN8S10098C63v14Ev();
extern void _ZN8S10098C63v15Ev();
extern void _ZN8S10098C63v16Ev();
static  VTBL_ENTRY vtc_S10098C6[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10098C6[0]),
  (VTBL_ENTRY)&_ZN8S10098C6D1Ev,
  (VTBL_ENTRY)&_ZN8S10098C6D0Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v13Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v14Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v15Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v16Ev,
};
extern VTBL_ENTRY _ZTI8S10098C6[];
extern  VTBL_ENTRY _ZTV8S10098C6[];
Class_Descriptor cd_S10098C6 = {  "S10098C6", // class name
  bases_S10098C6, 1,
  &(vtc_S10098C6[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI8S10098C6),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV8S10098C6),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C27  : S10098C6 {
  virtual void  v51(); // _ZN9S10098C273v51Ev
  ~S10098C27(); // tgen
  S10098C27(); // tgen
};
//SIG(-1 S10098C27) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v2 v3 v4 v5 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1}


void  S10098C27 ::v51(){vfunc_called(this, "_ZN9S10098C273v51Ev");}
S10098C27 ::~S10098C27(){ note_dtor("S10098C27", this);} // tgen
S10098C27 ::S10098C27(){ note_ctor("S10098C27", this);} // tgen

static void Test_S10098C27()
{
  extern Class_Descriptor cd_S10098C27;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10098C27, buf);
    S10098C27 *dp, &lv = *(dp=new (buf) S10098C27());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10098C27)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C27)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10098C6*), 0, "S10098C27");
    check_base_class_offset(lv, (S10098C6*), 0, "S10098C27");
    test_class_info(&lv, &cd_S10098C27);
    dp->~S10098C27();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C27(Test_S10098C27, "S10098C27", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN9S10098C27C1Ev();
extern void _ZN9S10098C27D1Ev();
Name_Map name_map_S10098C27[] = {
  NSPAIR(_ZN9S10098C27C1Ev),
  NSPAIR(_ZN9S10098C27D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10098C6;
extern VTBL_ENTRY _ZTI8S10098C6[];
extern  VTBL_ENTRY _ZTV8S10098C6[];
static Base_Class bases_S10098C27[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10098C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10098C27[];
extern void _ZN9S10098C27D1Ev();
extern void _ZN9S10098C27D0Ev();
extern void _ZN8S10098C63v13Ev();
extern void _ZN8S10098C63v14Ev();
extern void _ZN8S10098C63v15Ev();
extern void _ZN8S10098C63v16Ev();
extern void _ZN9S10098C273v51Ev();
static  VTBL_ENTRY vtc_S10098C27[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C27[0]),
  (VTBL_ENTRY)&_ZN9S10098C27D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C27D0Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v13Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v14Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v15Ev,
  (VTBL_ENTRY)&_ZN8S10098C63v16Ev,
  (VTBL_ENTRY)&_ZN9S10098C273v51Ev,
};
extern VTBL_ENTRY _ZTI9S10098C27[];
extern  VTBL_ENTRY _ZTV9S10098C27[];
Class_Descriptor cd_S10098C27 = {  "S10098C27", // class name
  bases_S10098C27, 2,
  &(vtc_S10098C27[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI9S10098C27),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10098C27),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C33_nt  {
  int s10098c33f0;
  void  mf10098c33(); // _ZN12S10098C33_nt10mf10098c33Ev
  virtual  ~S10098C33_nt(); // _ZN12S10098C33_ntD1Ev
  S10098C33_nt(); // tgen
};
//SIG(-1 S10098C33_nt) C1{ vd m Fi}


void  S10098C33_nt ::mf10098c33(){}
 S10098C33_nt ::~S10098C33_nt(){ note_dtor("S10098C33_nt", this);}
S10098C33_nt ::S10098C33_nt(){ note_ctor("S10098C33_nt", this);} // tgen

//skip512 S10098C33_nt

#else // __cplusplus

extern void _ZN12S10098C33_ntC1Ev();
extern void _ZN12S10098C33_ntD1Ev();
Name_Map name_map_S10098C33_nt[] = {
  NSPAIR(_ZN12S10098C33_ntC1Ev),
  NSPAIR(_ZN12S10098C33_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI12S10098C33_nt[];
extern void _ZN12S10098C33_ntD1Ev();
extern void _ZN12S10098C33_ntD0Ev();
static  VTBL_ENTRY vtc_S10098C33_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI12S10098C33_nt[0]),
  (VTBL_ENTRY)&_ZN12S10098C33_ntD1Ev,
  (VTBL_ENTRY)&_ZN12S10098C33_ntD0Ev,
};
extern VTBL_ENTRY _ZTI12S10098C33_nt[];
VTBL_ENTRY *P__ZTI12S10098C33_nt = _ZTI12S10098C33_nt; 
extern  VTBL_ENTRY _ZTV12S10098C33_nt[];
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C32  {
  ::S10098C33_nt s10098c32f0;
  void  mf10098c32(); // _ZN9S10098C3210mf10098c32Ev
  virtual  ~S10098C32(); // _ZN9S10098C32D1Ev
  S10098C32(); // tgen
};
//SIG(-1 S10098C32) C1{ vd m FC2{ vd m Fi}}


void  S10098C32 ::mf10098c32(){}
 S10098C32 ::~S10098C32(){ note_dtor("S10098C32", this);}
S10098C32 ::S10098C32(){ note_ctor("S10098C32", this);} // tgen

static void Test_S10098C32()
{
  extern Class_Descriptor cd_S10098C32;
  void *lvp;
  {
    ABISELECT(double,int) buf[4];
    init_test(&cd_S10098C32, buf);
    S10098C32 *dp, &lv = *(dp=new (buf) S10098C32());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,12), "sizeof(S10098C32)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C32)");
    check_field_offset(lv, s10098c32f0, ABISELECT(8,4), "S10098C32.s10098c32f0");
    test_class_info(&lv, &cd_S10098C32);
    dp->~S10098C32();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C32(Test_S10098C32, "S10098C32", ABISELECT(24,12));

#else // __cplusplus

extern void _ZN9S10098C32C1Ev();
extern void _ZN9S10098C32D1Ev();
Name_Map name_map_S10098C32[] = {
  NSPAIR(_ZN9S10098C32C1Ev),
  NSPAIR(_ZN9S10098C32D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10098C32[];
extern void _ZN9S10098C32D1Ev();
extern void _ZN9S10098C32D0Ev();
static  VTBL_ENTRY vtc_S10098C32[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C32[0]),
  (VTBL_ENTRY)&_ZN9S10098C32D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C32D0Ev,
};
extern VTBL_ENTRY _ZTI9S10098C32[];
extern  VTBL_ENTRY _ZTV9S10098C32[];
Class_Descriptor cd_S10098C32 = {  "S10098C32", // class name
  0,0,//no base classes
  &(vtc_S10098C32[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,12), // object size
  NSPAIRA(_ZTI9S10098C32),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10098C32),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C31  : S10103C5_nt {
  ::S10098C32 s10098c31f0;
  virtual  ~S10098C31(); // _ZN9S10098C31D1Ev
  S10098C31(); // tgen
};
//SIG(-1 S10098C31) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd FC5{ vd m FC6{ vd m Fi}}}


 S10098C31 ::~S10098C31(){ note_dtor("S10098C31", this);}
S10098C31 ::S10098C31(){ note_ctor("S10098C31", this);} // tgen

static void Test_S10098C31()
{
  extern Class_Descriptor cd_S10098C31;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_S10098C31, buf);
    S10098C31 *dp, &lv = *(dp=new (buf) S10098C31());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(S10098C31)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C31)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10098C31");
    check_field_offset(lv, s10098c31f0, ABISELECT(48,32), "S10098C31.s10098c31f0");
    test_class_info(&lv, &cd_S10098C31);
    dp->~S10098C31();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C31(Test_S10098C31, "S10098C31", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN9S10098C31C1Ev();
extern void _ZN9S10098C31D1Ev();
Name_Map name_map_S10098C31[] = {
  NSPAIR(_ZN9S10098C31C1Ev),
  NSPAIR(_ZN9S10098C31D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10098C31[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10098C31[];
extern void _ZN9S10098C31D1Ev();
extern void _ZN9S10098C31D0Ev();
static  VTBL_ENTRY vtc_S10098C31[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C31[0]),
  (VTBL_ENTRY)&_ZN9S10098C31D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C31D0Ev,
};
extern VTBL_ENTRY _ZTI9S10098C31[];
extern  VTBL_ENTRY _ZTV9S10098C31[];
Class_Descriptor cd_S10098C31 = {  "S10098C31", // class name
  bases_S10098C31, 1,
  &(vtc_S10098C31[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI9S10098C31),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10098C31),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C35  {
  ::S10103C106 s10098c35f0;
  ::S10103C106 s10098c35f1;
  void  mf10098c35(); // _ZN9S10098C3510mf10098c35Ev
  virtual  ~S10098C35(); // _ZN9S10098C35D1Ev
  S10098C35(); // tgen
};
//SIG(-1 S10098C35) C1{ vd m FC2{ m Fp Fi[2] FC3{ m}} FC2}


void  S10098C35 ::mf10098c35(){}
 S10098C35 ::~S10098C35(){ note_dtor("S10098C35", this);}
S10098C35 ::S10098C35(){ note_ctor("S10098C35", this);} // tgen

static void Test_S10098C35()
{
  extern Class_Descriptor cd_S10098C35;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,10)];
    init_test(&cd_S10098C35, buf);
    S10098C35 *dp, &lv = *(dp=new (buf) S10098C35());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,36), "sizeof(S10098C35)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C35)");
    check_field_offset(lv, s10098c35f0, ABISELECT(8,4), "S10098C35.s10098c35f0");
    check_field_offset(lv, s10098c35f1, ABISELECT(32,20), "S10098C35.s10098c35f1");
    test_class_info(&lv, &cd_S10098C35);
    dp->~S10098C35();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C35(Test_S10098C35, "S10098C35", ABISELECT(56,36));

#else // __cplusplus

extern void _ZN9S10098C35C1Ev();
extern void _ZN9S10098C35D1Ev();
Name_Map name_map_S10098C35[] = {
  NSPAIR(_ZN9S10098C35C1Ev),
  NSPAIR(_ZN9S10098C35D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10098C35[];
extern void _ZN9S10098C35D1Ev();
extern void _ZN9S10098C35D0Ev();
static  VTBL_ENTRY vtc_S10098C35[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C35[0]),
  (VTBL_ENTRY)&_ZN9S10098C35D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C35D0Ev,
};
extern VTBL_ENTRY _ZTI9S10098C35[];
extern  VTBL_ENTRY _ZTV9S10098C35[];
Class_Descriptor cd_S10098C35 = {  "S10098C35", // class name
  0,0,//no base classes
  &(vtc_S10098C35[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,36), // object size
  NSPAIRA(_ZTI9S10098C35),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10098C35),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C34  : S10098C35 {
  virtual  ~S10098C34(); // _ZN9S10098C34D1Ev
  S10098C34(); // tgen
};
//SIG(-1 S10098C34) C1{ BC2{ vd m FC3{ m Fp Fi[2] FC4{ m}} FC3} vd}


 S10098C34 ::~S10098C34(){ note_dtor("S10098C34", this);}
S10098C34 ::S10098C34(){ note_ctor("S10098C34", this);} // tgen

static void Test_S10098C34()
{
  extern Class_Descriptor cd_S10098C34;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,10)];
    init_test(&cd_S10098C34, buf);
    S10098C34 *dp, &lv = *(dp=new (buf) S10098C34());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,36), "sizeof(S10098C34)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C34)");
    check_base_class_offset(lv, (S10098C35*), 0, "S10098C34");
    test_class_info(&lv, &cd_S10098C34);
    dp->~S10098C34();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C34(Test_S10098C34, "S10098C34", ABISELECT(56,36));

#else // __cplusplus

extern void _ZN9S10098C34C1Ev();
extern void _ZN9S10098C34D1Ev();
Name_Map name_map_S10098C34[] = {
  NSPAIR(_ZN9S10098C34C1Ev),
  NSPAIR(_ZN9S10098C34D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10098C35;
extern VTBL_ENTRY _ZTI9S10098C35[];
extern  VTBL_ENTRY _ZTV9S10098C35[];
static Base_Class bases_S10098C34[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10098C35,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10098C34[];
extern void _ZN9S10098C34D1Ev();
extern void _ZN9S10098C34D0Ev();
static  VTBL_ENTRY vtc_S10098C34[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C34[0]),
  (VTBL_ENTRY)&_ZN9S10098C34D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C34D0Ev,
};
extern VTBL_ENTRY _ZTI9S10098C34[];
extern  VTBL_ENTRY _ZTV9S10098C34[];
Class_Descriptor cd_S10098C34 = {  "S10098C34", // class name
  bases_S10098C34, 1,
  &(vtc_S10098C34[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,36), // object size
  NSPAIRA(_ZTI9S10098C34),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10098C34),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C39  {
  char s10098c39f0;
  int s10098c39f1[3];
  __tsi64 s10098c39f2[6];
  char s10098c39f3[672];
};
//SIG(-1 S10098C39) C1{ Fc Fi[3] FL[6] Fc[672]}



static void Test_S10098C39()
{
  {
    init_simple_test("S10098C39");
    S10098C39 lv;
    check2(sizeof(lv), 736, "sizeof(S10098C39)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C39)");
    check_field_offset(lv, s10098c39f0, 0, "S10098C39.s10098c39f0");
    check_field_offset(lv, s10098c39f1, 4, "S10098C39.s10098c39f1");
    check_field_offset(lv, s10098c39f2, 16, "S10098C39.s10098c39f2");
    check_field_offset(lv, s10098c39f3, 64, "S10098C39.s10098c39f3");
  }
}
static Arrange_To_Call_Me vS10098C39(Test_S10098C39, "S10098C39", 736);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C38  {
  ::S10103C14_nt s10098c38f0;
  ::S10103C14_nt s10098c38f1;
  __tsi64 s10098c38f2;
  ::S10103C14_nt s10098c38f3;
  ::S10103C14_nt s10098c38f4;
  ::S10103C14_nt s10098c38f5;
  ::S10098C39 s10098c38f6;
  void  mf10098c38(); // _ZN9S10098C3810mf10098c38Ev
  virtual  ~S10098C38(); // _ZN9S10098C38D1Ev
  S10098C38(); // tgen
};
//SIG(-1 S10098C38) C1{ vd m FC2{ m Fp Fi FC3{ m}} FC2 FL FC2 FC2 FC2 FC4{ Fc Fi[3] FL[6] Fc[672]}}


void  S10098C38 ::mf10098c38(){}
 S10098C38 ::~S10098C38(){ note_dtor("S10098C38", this);}
S10098C38 ::S10098C38(){ note_ctor("S10098C38", this);} // tgen

static void Test_S10098C38()
{
  extern Class_Descriptor cd_S10098C38;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(105,203)];
    init_test(&cd_S10098C38, buf);
    S10098C38 *dp, &lv = *(dp=new (buf) S10098C38());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(832,808), "sizeof(S10098C38)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C38)");
    check_field_offset(lv, s10098c38f0, ABISELECT(8,4), "S10098C38.s10098c38f0");
    check_field_offset(lv, s10098c38f1, ABISELECT(24,16), "S10098C38.s10098c38f1");
    check_field_offset(lv, s10098c38f2, ABISELECT(40,28), "S10098C38.s10098c38f2");
    check_field_offset(lv, s10098c38f3, ABISELECT(48,36), "S10098C38.s10098c38f3");
    check_field_offset(lv, s10098c38f4, ABISELECT(64,48), "S10098C38.s10098c38f4");
    check_field_offset(lv, s10098c38f5, ABISELECT(80,60), "S10098C38.s10098c38f5");
    check_field_offset(lv, s10098c38f6, ABISELECT(96,72), "S10098C38.s10098c38f6");
    test_class_info(&lv, &cd_S10098C38);
    dp->~S10098C38();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C38(Test_S10098C38, "S10098C38", ABISELECT(832,808));

#else // __cplusplus

extern void _ZN9S10098C38C1Ev();
extern void _ZN9S10098C38D1Ev();
Name_Map name_map_S10098C38[] = {
  NSPAIR(_ZN9S10098C38C1Ev),
  NSPAIR(_ZN9S10098C38D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10098C38[];
extern void _ZN9S10098C38D1Ev();
extern void _ZN9S10098C38D0Ev();
static  VTBL_ENTRY vtc_S10098C38[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10098C38[0]),
  (VTBL_ENTRY)&_ZN9S10098C38D1Ev,
  (VTBL_ENTRY)&_ZN9S10098C38D0Ev,
};
extern VTBL_ENTRY _ZTI9S10098C38[];
extern  VTBL_ENTRY _ZTV9S10098C38[];
Class_Descriptor cd_S10098C38 = {  "S10098C38", // class name
  0,0,//no base classes
  &(vtc_S10098C38[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(832,808), // object size
  NSPAIRA(_ZTI9S10098C38),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10098C38),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C18_nt  {
  void *s10098c18f0;
  int s10098c18f1;
  ::S10103C88 s10098c18f2;
  void  mf10098c18(); // _ZN12S10098C18_nt10mf10098c18Ev
};
//SIG(-1 S10098C18_nt) C1{ m Fp Fi FC2{ m}}


void  S10098C18_nt ::mf10098c18(){}

//skip512 S10098C18_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10098C1  : S10098C2 , S10098C3 , S10098C4 {
  ::S10103C56 s10098c1f0;
  ::S10103C47 s10098c1f1;
  ::S10098C21 s10098c1f2;
  ::S10098C25 s10098c1f3;
  ::S10103C49 s10098c1f4;
  ::S10098C27 s10098c1f5;
  ::S10098C27 s10098c1f6;
  ::S10098C27 s10098c1f7;
  ::S10103C40 s10098c1f8;
  ::S10102C49 s10098c1f9;
  ::S10098C31 s10098c1f10;
  ::S10098C34 s10098c1f11;
  ::S10098C38 s10098c1f12;
  ::S10098C18_nt s10098c1f13;
  int s10098c1f14;
  virtual  ~S10098C1(); // _ZN8S10098C1D1Ev
  virtual void  v1(); // _ZN8S10098C12v1Ev
  virtual void  v2(); // _ZN8S10098C12v2Ev
  virtual void  v3(); // _ZN8S10098C12v3Ev
  virtual void  v4(); // _ZN8S10098C12v4Ev
  virtual void  v5(); // _ZN8S10098C12v5Ev
  S10098C1(); // tgen
};
//SIG(1 S10098C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} BC4{ vd m Fp[4] Fi} vd v1 v2 v3 v4 v5 FC5{ BC6{ BC7{ vd m FC8{ m Fp Fi FC9{ m} FC9} FC8 Fc} vd v13 v14 v15 v16 FC10{ m Fp FC11{ m FC12{ m Fp Fi FC13{ m}} Fi} FC12 FC12 Fi} Fp Fc Fi} v12} FC14{ BC6 v17} FC15{ BC7 BC16{ vd v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 Fp FC11 FC17{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC18{ m Fc Fi[2] Fp}} vd v18 v19} FC19{ BC7 BC16 vd v44 v45 v46 v47 v48 Fi} FC20{ BC6 v49 v50} FC21{ BC22{ BC7 vd v52 v53 v54 v55 FC10 Fp Fc Fi} v51} FC21 FC21 FC23{ BC6 v56 v57} FC24{ BC25{ BC7 vd v60 v61 v62 v63 FC10 Fp Fc Fi} v58 v59} FC26{ BC7 vd FC27{ vd m FC28{ vd m Fi}}} FC29{ BC30{ vd m FC31{ m Fp Fi[2] FC32{ m}} FC31} vd} FC33{ vd m FC12 FC12 FL FC12 FC12 FC12 FC34{ Fc Fi[3] FL[6] Fc[672]}} FC35{ m Fp Fi FC32} Fi}


 S10098C1 ::~S10098C1(){ note_dtor("S10098C1", this);}
void  S10098C1 ::v1(){vfunc_called(this, "_ZN8S10098C12v1Ev");}
void  S10098C1 ::v2(){vfunc_called(this, "_ZN8S10098C12v2Ev");}
void  S10098C1 ::v3(){vfunc_called(this, "_ZN8S10098C12v3Ev");}
void  S10098C1 ::v4(){vfunc_called(this, "_ZN8S10098C12v4Ev");}
void  S10098C1 ::v5(){vfunc_called(this, "_ZN8S10098C12v5Ev");}
S10098C1 ::S10098C1(){ note_ctor("S10098C1", this);} // tgen

static void Test_S10098C1()
{
  extern Class_Descriptor cd_S10098C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(312,477)];
    init_test(&cd_S10098C1, buf);
    S10098C1 *dp, &lv = *(dp=new (buf) S10098C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2488,1904), "sizeof(S10098C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10098C1)");
    check_base_class_offset(lv, (S10098C2*), 0, "S10098C1");
    check_base_class_offset(lv, (S10098C3*), ABISELECT(8,4), "S10098C1");
    check_base_class_offset(lv, (S10098C4*), ABISELECT(24,12), "S10098C1");
    check_field_offset(lv, s10098c1f0, ABISELECT(72,36), "S10098C1.s10098c1f0");
    check_field_offset(lv, s10098c1f1, ABISELECT(208,128), "S10098C1.s10098c1f1");
    check_field_offset(lv, s10098c1f2, ABISELECT(344,220), "S10098C1.s10098c1f2");
    check_field_offset(lv, s10098c1f3, ABISELECT(512,332), "S10098C1.s10098c1f3");
    check_field_offset(lv, s10098c1f4, ABISELECT(688,448), "S10098C1.s10098c1f4");
    check_field_offset(lv, s10098c1f5, ABISELECT(824,540), "S10098C1.s10098c1f5");
    check_field_offset(lv, s10098c1f6, ABISELECT(960,632), "S10098C1.s10098c1f6");
    check_field_offset(lv, s10098c1f7, ABISELECT(1096,724), "S10098C1.s10098c1f7");
    check_field_offset(lv, s10098c1f8, ABISELECT(1232,816), "S10098C1.s10098c1f8");
    check_field_offset(lv, s10098c1f9, ABISELECT(1368,908), "S10098C1.s10098c1f9");
    check_field_offset(lv, s10098c1f10, ABISELECT(1504,1000), "S10098C1.s10098c1f10");
    check_field_offset(lv, s10098c1f11, ABISELECT(1576,1044), "S10098C1.s10098c1f11");
    check_field_offset(lv, s10098c1f12, ABISELECT(1632,1080), "S10098C1.s10098c1f12");
    check_field_offset(lv, s10098c1f13, ABISELECT(2464,1888), "S10098C1.s10098c1f13");
    check_field_offset(lv, s10098c1f14, ABISELECT(2480,1900), "S10098C1.s10098c1f14");
    test_class_info(&lv, &cd_S10098C1);
    dp->~S10098C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10098C1(Test_S10098C1, "S10098C1", ABISELECT(2488,1904));

#else // __cplusplus

extern void _ZN8S10098C1C1Ev();
extern void _ZN8S10098C1D1Ev();
Name_Map name_map_S10098C1[] = {
  NSPAIR(_ZN8S10098C1C1Ev),
  NSPAIR(_ZN8S10098C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10098C2;
extern VTBL_ENTRY _ZTI8S10098C2[];
extern  VTBL_ENTRY _ZTV8S10098C2[];
extern Class_Descriptor cd_S10098C3;
extern VTBL_ENTRY _ZTI8S10098C3[];
extern  VTBL_ENTRY _ZTV8S10098C3[];
extern Class_Descriptor cd_S10098C4;
extern VTBL_ENTRY _ZTI8S10098C4[];
extern  VTBL_ENTRY _ZTV8S10098C4[];
static Base_Class bases_S10098C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10098C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10098C3,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10098C4,    ABISELECT(24,12), //bcp->offset
    19, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10098C1[];
extern void _ZN8S10098C1D1Ev();
extern void _ZN8S10098C1D0Ev();
extern void _ZN8S10098C22v6Ev();
extern void _ZN8S10098C12v1Ev();
extern void _ZN8S10098C12v2Ev();
extern void _ZN8S10098C12v3Ev();
extern void _ZN8S10098C12v4Ev();
extern void _ZN8S10098C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10098C1D1Ev,_ZThn4_N8S10098C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10098C1D0Ev,_ZThn4_N8S10098C1D0Ev)();
extern void _ZN8S10098C32v7Ev();
extern void _ZN8S10098C32v8Ev();
extern void _ZN8S10098C32v9Ev();
extern void _ZN8S10098C33v10Ev();
extern void _ZN8S10098C33v11Ev();
extern void ABISELECT(_ZThn24_N8S10098C1D1Ev,_ZThn12_N8S10098C1D1Ev)();
extern void ABISELECT(_ZThn24_N8S10098C1D0Ev,_ZThn12_N8S10098C1D0Ev)();
static  VTBL_ENTRY vtc_S10098C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10098C1[0]),
  (VTBL_ENTRY)&_ZN8S10098C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10098C1D0Ev,
  (VTBL_ENTRY)&_ZN8S10098C22v6Ev,
  (VTBL_ENTRY)&_ZN8S10098C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10098C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10098C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10098C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10098C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10098C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10098C1D1Ev,_ZThn4_N8S10098C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10098C1D0Ev,_ZThn4_N8S10098C1D0Ev),
  (VTBL_ENTRY)&_ZN8S10098C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10098C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10098C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10098C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10098C33v11Ev,
  ABISELECT(-24,-12),
  (VTBL_ENTRY)&(_ZTI8S10098C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn24_N8S10098C1D1Ev,_ZThn12_N8S10098C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn24_N8S10098C1D0Ev,_ZThn12_N8S10098C1D0Ev),
};
extern VTBL_ENTRY _ZTI8S10098C1[];
extern  VTBL_ENTRY _ZTV8S10098C1[];
Class_Descriptor cd_S10098C1 = {  "S10098C1", // class name
  bases_S10098C1, 3,
  &(vtc_S10098C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2488,1904), // object size
  NSPAIRA(_ZTI8S10098C1),ABISELECT(72,40), //typeinfo_var
  NSPAIRA(_ZTV8S10098C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C2  {
  virtual  ~S10097C2(); // _ZN8S10097C2D1Ev
  virtual void  v6(); // _ZN8S10097C22v6Ev
  S10097C2(); // tgen
};
//SIG(-1 S10097C2) C1{ vd v1}


 S10097C2 ::~S10097C2(){ note_dtor("S10097C2", this);}
void  S10097C2 ::v6(){vfunc_called(this, "_ZN8S10097C22v6Ev");}
S10097C2 ::S10097C2(){ note_ctor("S10097C2", this);} // tgen

static void Test_S10097C2()
{
  extern Class_Descriptor cd_S10097C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S10097C2, buf);
    S10097C2 *dp, &lv = *(dp=new (buf) S10097C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10097C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C2)");
    test_class_info(&lv, &cd_S10097C2);
    dp->~S10097C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C2(Test_S10097C2, "S10097C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S10097C2C1Ev();
extern void _ZN8S10097C2D1Ev();
Name_Map name_map_S10097C2[] = {
  NSPAIR(_ZN8S10097C2C1Ev),
  NSPAIR(_ZN8S10097C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10097C2[];
extern void _ZN8S10097C2D1Ev();
extern void _ZN8S10097C2D0Ev();
extern void _ZN8S10097C22v6Ev();
static  VTBL_ENTRY vtc_S10097C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10097C2[0]),
  (VTBL_ENTRY)&_ZN8S10097C2D1Ev,
  (VTBL_ENTRY)&_ZN8S10097C2D0Ev,
  (VTBL_ENTRY)&_ZN8S10097C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10097C2[];
extern  VTBL_ENTRY _ZTV8S10097C2[];
Class_Descriptor cd_S10097C2 = {  "S10097C2", // class name
  0,0,//no base classes
  &(vtc_S10097C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S10097C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10097C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C3  {
  void *s10097c3f0;
  virtual  ~S10097C3(); // _ZN8S10097C3D1Ev
  virtual void  v7(); // _ZN8S10097C32v7Ev
  virtual void  v8(); // _ZN8S10097C32v8Ev
  virtual void  v9(); // _ZN8S10097C32v9Ev
  virtual void  v10(); // _ZN8S10097C33v10Ev
  virtual void  v11(); // _ZN8S10097C33v11Ev
  S10097C3(); // tgen
};
//SIG(-1 S10097C3) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10097C3 ::~S10097C3(){ note_dtor("S10097C3", this);}
void  S10097C3 ::v7(){vfunc_called(this, "_ZN8S10097C32v7Ev");}
void  S10097C3 ::v8(){vfunc_called(this, "_ZN8S10097C32v8Ev");}
void  S10097C3 ::v9(){vfunc_called(this, "_ZN8S10097C32v9Ev");}
void  S10097C3 ::v10(){vfunc_called(this, "_ZN8S10097C33v10Ev");}
void  S10097C3 ::v11(){vfunc_called(this, "_ZN8S10097C33v11Ev");}
S10097C3 ::S10097C3(){ note_ctor("S10097C3", this);} // tgen

static void Test_S10097C3()
{
  extern Class_Descriptor cd_S10097C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_S10097C3, buf);
    S10097C3 *dp, &lv = *(dp=new (buf) S10097C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S10097C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C3)");
    check_field_offset(lv, s10097c3f0, ABISELECT(8,4), "S10097C3.s10097c3f0");
    test_class_info(&lv, &cd_S10097C3);
    dp->~S10097C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C3(Test_S10097C3, "S10097C3", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN8S10097C3C1Ev();
extern void _ZN8S10097C3D1Ev();
Name_Map name_map_S10097C3[] = {
  NSPAIR(_ZN8S10097C3C1Ev),
  NSPAIR(_ZN8S10097C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10097C3[];
extern void _ZN8S10097C3D1Ev();
extern void _ZN8S10097C3D0Ev();
extern void _ZN8S10097C32v7Ev();
extern void _ZN8S10097C32v8Ev();
extern void _ZN8S10097C32v9Ev();
extern void _ZN8S10097C33v10Ev();
extern void _ZN8S10097C33v11Ev();
static  VTBL_ENTRY vtc_S10097C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10097C3[0]),
  (VTBL_ENTRY)&_ZN8S10097C3D1Ev,
  (VTBL_ENTRY)&_ZN8S10097C3D0Ev,
  (VTBL_ENTRY)&_ZN8S10097C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10097C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10097C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10097C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10097C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10097C3[];
extern  VTBL_ENTRY _ZTV8S10097C3[];
Class_Descriptor cd_S10097C3 = {  "S10097C3", // class name
  0,0,//no base classes
  &(vtc_S10097C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI8S10097C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10097C3),9, //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

struct  S10097C6  : S10103C5_nt {
  ::S10103C42 s10097c6f0;
  void *s10097c6f1;
  char s10097c6f2;
  int s10097c6f3;
  virtual  ~S10097C6(); // _ZN8S10097C6D1Ev
  virtual void  v13(); // _ZN8S10097C63v13Ev
  virtual void  v14(); // _ZN8S10097C63v14Ev
  virtual void  v15(); // _ZN8S10097C63v15Ev
  virtual void  v16(); // _ZN8S10097C63v16Ev
  S10097C6(); // tgen
};
//SIG(-1 S10097C6) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} vd v1 v2 v3 v4 FC5{ m Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC7 FC7 Fi} Fp Fc Fi}


 S10097C6 ::~S10097C6(){ note_dtor("S10097C6", this);}
void  S10097C6 ::v13(){vfunc_called(this, "_ZN8S10097C63v13Ev");}
void  S10097C6 ::v14(){vfunc_called(this, "_ZN8S10097C63v14Ev");}
void  S10097C6 ::v15(){vfunc_called(this, "_ZN8S10097C63v15Ev");}
void  S10097C6 ::v16(){vfunc_called(this, "_ZN8S10097C63v16Ev");}
S10097C6 ::S10097C6(){ note_ctor("S10097C6", this);} // tgen

static void Test_S10097C6()
{
  extern Class_Descriptor cd_S10097C6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S10097C6, buf);
    S10097C6 *dp, &lv = *(dp=new (buf) S10097C6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S10097C6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C6)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10097C6");
    check_field_offset(lv, s10097c6f0, ABISELECT(48,32), "S10097C6.s10097c6f0");
    check_field_offset(lv, s10097c6f1, ABISELECT(120,80), "S10097C6.s10097c6f1");
    check_field_offset(lv, s10097c6f2, ABISELECT(128,84), "S10097C6.s10097c6f2");
    check_field_offset(lv, s10097c6f3, ABISELECT(132,88), "S10097C6.s10097c6f3");
    test_class_info(&lv, &cd_S10097C6);
    dp->~S10097C6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C6(Test_S10097C6, "S10097C6", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN8S10097C6C1Ev();
extern void _ZN8S10097C6D1Ev();
Name_Map name_map_S10097C6[] = {
  NSPAIR(_ZN8S10097C6C1Ev),
  NSPAIR(_ZN8S10097C6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
static Base_Class bases_S10097C6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10097C6[];
extern void _ZN8S10097C6D1Ev();
extern void _ZN8S10097C6D0Ev();
extern void _ZN8S10097C63v13Ev();
extern void _ZN8S10097C63v14Ev();
extern void _ZN8S10097C63v15Ev();
extern void _ZN8S10097C63v16Ev();
static  VTBL_ENTRY vtc_S10097C6[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10097C6[0]),
  (VTBL_ENTRY)&_ZN8S10097C6D1Ev,
  (VTBL_ENTRY)&_ZN8S10097C6D0Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v13Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v14Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v15Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v16Ev,
};
extern VTBL_ENTRY _ZTI8S10097C6[];
extern  VTBL_ENTRY _ZTV8S10097C6[];
Class_Descriptor cd_S10097C6 = {  "S10097C6", // class name
  bases_S10097C6, 1,
  &(vtc_S10097C6[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI8S10097C6),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV8S10097C6),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C22_nt  {
  void *s10097c22f0;
  ::S10103C82_nt s10097c22f1;
  ::S10103C82_nt s10097c22f2;
  int s10097c22f3[3];
  char s10097c22f4[2];
  int s10097c22f5;
  void *s10097c22f6;
  void  mf10097c22(); // _ZN12S10097C22_nt10mf10097c22Ev
};
//SIG(-1 S10097C22_nt) C1{ m Fp FC2{ m FC3{ m FL[2]}} FC2 Fi[3] Fc[2] Fi Fp}


void  S10097C22_nt ::mf10097c22(){}

//skip512 S10097C22_nt

#else // __cplusplus

Class_Descriptor cd_S10097C22_nt = {  "S10097C22_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(72,60), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C21  : S10097C22_nt {
  ::S10103C14_nt s10097c21f0;
  ::S10103C14_nt s10097c21f1;
  __tsi64 s10097c21f2;
};
//SIG(-1 S10097C21) C1{ BC2{ m Fp FC3{ m FC4{ m FL[2]}} FC3 Fi[3] Fc[2] Fi Fp} FC5{ m Fp Fi FC6{ m}} FC5 FL}



static void Test_S10097C21()
{
  extern Class_Descriptor cd_S10097C21;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,24)];
    init_test(&cd_S10097C21, buf);
    S10097C21 &lv = *(new (buf) S10097C21());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,92), "sizeof(S10097C21)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C21)");
    check_base_class_offset(lv, (S10097C22_nt*), 0, "S10097C21");
    check_field_offset(lv, s10097c21f0, ABISELECT(72,60), "S10097C21.s10097c21f0");
    check_field_offset(lv, s10097c21f1, ABISELECT(88,72), "S10097C21.s10097c21f1");
    check_field_offset(lv, s10097c21f2, ABISELECT(104,84), "S10097C21.s10097c21f2");
    test_class_info(&lv, &cd_S10097C21);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C21(Test_S10097C21, "S10097C21", ABISELECT(112,92));

#else // __cplusplus

extern Class_Descriptor cd_S10097C22_nt;
static Base_Class bases_S10097C21[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10097C22_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S10097C21 = {  "S10097C21", // class name
  bases_S10097C21, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(112,92), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C20  : S10097C6 {
  void *s10097c20f0;
  ::S10097C21 s10097c20f1;
  virtual void  v17(); // _ZN9S10097C203v17Ev
  virtual void  v18(); // _ZN9S10097C203v18Ev
  ~S10097C20(); // tgen
  S10097C20(); // tgen
};
//SIG(-1 S10097C20) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} vd v3 v4 v5 v6 FC6{ m Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC8 FC8 Fi} Fp Fc Fi} v1 v2 Fp FC10{ BC11{ m Fp FC12{ m FC13{ m FL[2]}} FC12 Fi[3] Fc[2] Fi Fp} FC8 FC8 FL}}


void  S10097C20 ::v17(){vfunc_called(this, "_ZN9S10097C203v17Ev");}
void  S10097C20 ::v18(){vfunc_called(this, "_ZN9S10097C203v18Ev");}
S10097C20 ::~S10097C20(){ note_dtor("S10097C20", this);} // tgen
S10097C20 ::S10097C20(){ note_ctor("S10097C20", this);} // tgen

static void Test_S10097C20()
{
  extern Class_Descriptor cd_S10097C20;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,48)];
    init_test(&cd_S10097C20, buf);
    S10097C20 *dp, &lv = *(dp=new (buf) S10097C20());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,188), "sizeof(S10097C20)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C20)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10097C6*), 0, "S10097C20");
    check_base_class_offset(lv, (S10097C6*), 0, "S10097C20");
    check_field_offset(lv, s10097c20f0, ABISELECT(136,92), "S10097C20.s10097c20f0");
    check_field_offset(lv, s10097c20f1, ABISELECT(144,96), "S10097C20.s10097c20f1");
    test_class_info(&lv, &cd_S10097C20);
    dp->~S10097C20();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C20(Test_S10097C20, "S10097C20", ABISELECT(256,188));

#else // __cplusplus

extern void _ZN9S10097C20C1Ev();
extern void _ZN9S10097C20D1Ev();
Name_Map name_map_S10097C20[] = {
  NSPAIR(_ZN9S10097C20C1Ev),
  NSPAIR(_ZN9S10097C20D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10097C6;
extern VTBL_ENTRY _ZTI8S10097C6[];
extern  VTBL_ENTRY _ZTV8S10097C6[];
static Base_Class bases_S10097C20[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S10097C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI9S10097C20[];
extern void _ZN9S10097C20D1Ev();
extern void _ZN9S10097C20D0Ev();
extern void _ZN8S10097C63v13Ev();
extern void _ZN8S10097C63v14Ev();
extern void _ZN8S10097C63v15Ev();
extern void _ZN8S10097C63v16Ev();
extern void _ZN9S10097C203v17Ev();
extern void _ZN9S10097C203v18Ev();
static  VTBL_ENTRY vtc_S10097C20[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10097C20[0]),
  (VTBL_ENTRY)&_ZN9S10097C20D1Ev,
  (VTBL_ENTRY)&_ZN9S10097C20D0Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v13Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v14Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v15Ev,
  (VTBL_ENTRY)&_ZN8S10097C63v16Ev,
  (VTBL_ENTRY)&_ZN9S10097C203v17Ev,
  (VTBL_ENTRY)&_ZN9S10097C203v18Ev,
};
extern VTBL_ENTRY _ZTI9S10097C20[];
extern  VTBL_ENTRY _ZTV9S10097C20[];
Class_Descriptor cd_S10097C20 = {  "S10097C20", // class name
  bases_S10097C20, 2,
  &(vtc_S10097C20[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,188), // object size
  NSPAIRA(_ZTI9S10097C20),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV9S10097C20),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C31  {
  ::S10098C18_nt s10097c31f0;
  ::S10098C18_nt s10097c31f1;
  ::S10098C18_nt s10097c31f2;
  ::S10098C18_nt s10097c31f3;
  ::S10098C18_nt s10097c31f4;
  __tsi64 s10097c31f5[2];
  int s10097c31f6[3];
  void  mf10097c31(); // _ZN9S10097C3110mf10097c31Ev
  virtual  ~S10097C31(); // _ZN9S10097C31D1Ev
  S10097C31(); // tgen
};
//SIG(-1 S10097C31) C1{ vd m FC2{ m Fp Fi FC3{ m}} FC2 FC2 FC2 FC2 FL[2] Fi[3]}


void  S10097C31 ::mf10097c31(){}
 S10097C31 ::~S10097C31(){ note_dtor("S10097C31", this);}
S10097C31 ::S10097C31(){ note_ctor("S10097C31", this);} // tgen

static void Test_S10097C31()
{
  extern Class_Descriptor cd_S10097C31;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,24)];
    init_test(&cd_S10097C31, buf);
    S10097C31 *dp, &lv = *(dp=new (buf) S10097C31());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,92), "sizeof(S10097C31)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C31)");
    check_field_offset(lv, s10097c31f0, ABISELECT(8,4), "S10097C31.s10097c31f0");
    check_field_offset(lv, s10097c31f1, ABISELECT(24,16), "S10097C31.s10097c31f1");
    check_field_offset(lv, s10097c31f2, ABISELECT(40,28), "S10097C31.s10097c31f2");
    check_field_offset(lv, s10097c31f3, ABISELECT(56,40), "S10097C31.s10097c31f3");
    check_field_offset(lv, s10097c31f4, ABISELECT(72,52), "S10097C31.s10097c31f4");
    check_field_offset(lv, s10097c31f5, ABISELECT(88,64), "S10097C31.s10097c31f5");
    check_field_offset(lv, s10097c31f6, ABISELECT(104,80), "S10097C31.s10097c31f6");
    test_class_info(&lv, &cd_S10097C31);
    dp->~S10097C31();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C31(Test_S10097C31, "S10097C31", ABISELECT(120,92));

#else // __cplusplus

extern void _ZN9S10097C31C1Ev();
extern void _ZN9S10097C31D1Ev();
Name_Map name_map_S10097C31[] = {
  NSPAIR(_ZN9S10097C31C1Ev),
  NSPAIR(_ZN9S10097C31D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10097C31[];
extern void _ZN9S10097C31D1Ev();
extern void _ZN9S10097C31D0Ev();
static  VTBL_ENTRY vtc_S10097C31[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10097C31[0]),
  (VTBL_ENTRY)&_ZN9S10097C31D1Ev,
  (VTBL_ENTRY)&_ZN9S10097C31D0Ev,
};
extern VTBL_ENTRY _ZTI9S10097C31[];
extern  VTBL_ENTRY _ZTV9S10097C31[];
Class_Descriptor cd_S10097C31 = {  "S10097C31", // class name
  0,0,//no base classes
  &(vtc_S10097C31[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,92), // object size
  NSPAIRA(_ZTI9S10097C31),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10097C31),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C32  {
  __tsi64 s10097c32f0[2];
  int s10097c32f1[3];
  void  mf10097c32(); // _ZN9S10097C3210mf10097c32Ev
  virtual  ~S10097C32(); // _ZN9S10097C32D1Ev
  S10097C32(); // tgen
};
//SIG(-1 S10097C32) C1{ vd m FL[2] Fi[3]}


void  S10097C32 ::mf10097c32(){}
 S10097C32 ::~S10097C32(){ note_dtor("S10097C32", this);}
S10097C32 ::S10097C32(){ note_ctor("S10097C32", this);} // tgen

static void Test_S10097C32()
{
  extern Class_Descriptor cd_S10097C32;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_S10097C32, buf);
    S10097C32 *dp, &lv = *(dp=new (buf) S10097C32());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(S10097C32)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C32)");
    check_field_offset(lv, s10097c32f0, ABISELECT(8,4), "S10097C32.s10097c32f0");
    check_field_offset(lv, s10097c32f1, ABISELECT(24,20), "S10097C32.s10097c32f1");
    test_class_info(&lv, &cd_S10097C32);
    dp->~S10097C32();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C32(Test_S10097C32, "S10097C32", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN9S10097C32C1Ev();
extern void _ZN9S10097C32D1Ev();
Name_Map name_map_S10097C32[] = {
  NSPAIR(_ZN9S10097C32C1Ev),
  NSPAIR(_ZN9S10097C32D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10097C32[];
extern void _ZN9S10097C32D1Ev();
extern void _ZN9S10097C32D0Ev();
static  VTBL_ENTRY vtc_S10097C32[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10097C32[0]),
  (VTBL_ENTRY)&_ZN9S10097C32D1Ev,
  (VTBL_ENTRY)&_ZN9S10097C32D0Ev,
};
extern VTBL_ENTRY _ZTI9S10097C32[];
extern  VTBL_ENTRY _ZTV9S10097C32[];
Class_Descriptor cd_S10097C32 = {  "S10097C32", // class name
  0,0,//no base classes
  &(vtc_S10097C32[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI9S10097C32),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10097C32),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

struct  S10097C30  {
  ::S10097C31 s10097c30f0;
  ::S10103C14_nt s10097c30f1;
  ::S10097C32 s10097c30f2;
  int s10097c30f3;
  void  mf10097c30(); // _ZN9S10097C3010mf10097c30Ev
  virtual  ~S10097C30(); // _ZN9S10097C30D1Ev
  S10097C30(); // tgen
};
//SIG(-1 S10097C30) C1{ vd m FC2{ vd m FC3{ m Fp Fi FC4{ m}} FC3 FC3 FC3 FC3 FL[2] Fi[3]} FC5{ m Fp Fi FC6{ m}} FC7{ vd m FL[2] Fi[3]} Fi}


void  S10097C30 ::mf10097c30(){}
 S10097C30 ::~S10097C30(){ note_dtor("S10097C30", this);}
S10097C30 ::S10097C30(){ note_ctor("S10097C30", this);} // tgen

static void Test_S10097C30()
{
  extern Class_Descriptor cd_S10097C30;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,37)];
    init_test(&cd_S10097C30, buf);
    S10097C30 *dp, &lv = *(dp=new (buf) S10097C30());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,144), "sizeof(S10097C30)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C30)");
    check_field_offset(lv, s10097c30f0, ABISELECT(8,4), "S10097C30.s10097c30f0");
    check_field_offset(lv, s10097c30f1, ABISELECT(128,96), "S10097C30.s10097c30f1");
    check_field_offset(lv, s10097c30f2, ABISELECT(144,108), "S10097C30.s10097c30f2");
    check_field_offset(lv, s10097c30f3, ABISELECT(184,140), "S10097C30.s10097c30f3");
    test_class_info(&lv, &cd_S10097C30);
    dp->~S10097C30();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C30(Test_S10097C30, "S10097C30", ABISELECT(192,144));

#else // __cplusplus

extern void _ZN9S10097C30C1Ev();
extern void _ZN9S10097C30D1Ev();
Name_Map name_map_S10097C30[] = {
  NSPAIR(_ZN9S10097C30C1Ev),
  NSPAIR(_ZN9S10097C30D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10097C30[];
extern void _ZN9S10097C30D1Ev();
extern void _ZN9S10097C30D0Ev();
static  VTBL_ENTRY vtc_S10097C30[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10097C30[0]),
  (VTBL_ENTRY)&_ZN9S10097C30D1Ev,
  (VTBL_ENTRY)&_ZN9S10097C30D0Ev,
};
extern VTBL_ENTRY _ZTI9S10097C30[];
extern  VTBL_ENTRY _ZTV9S10097C30[];
Class_Descriptor cd_S10097C30 = {  "S10097C30", // class name
  0,0,//no base classes
  &(vtc_S10097C30[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,144), // object size
  NSPAIRA(_ZTI9S10097C30),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10097C30),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10097C1  : S10097C2 , S10097C3 , S10098C4 {
  ::S10103C56 s10097c1f0;
  ::S10097C20 s10097c1f1;
  ::S10103C49 s10097c1f2;
  ::S10098C21 s10097c1f3;
  void *s10097c1f4;
  int s10097c1f5;
  ::S10103C14_nt s10097c1f6;
  ::S10097C30 s10097c1f7;
  ::S10098C34 s10097c1f8;
  virtual  ~S10097C1(); // _ZN8S10097C1D1Ev
  virtual void  v1(); // _ZN8S10097C12v1Ev
  virtual void  v2(); // _ZN8S10097C12v2Ev
  virtual void  v3(); // _ZN8S10097C12v3Ev
  virtual void  v4(); // _ZN8S10097C12v4Ev
  virtual void  v5(); // _ZN8S10097C12v5Ev
  S10097C1(); // tgen
};
//SIG(1 S10097C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} BC4{ vd m Fp[4] Fi} vd v1 v2 v3 v4 v5 FC5{ BC6{ BC7{ vd m FC8{ m Fp Fi FC9{ m} FC9} FC8 Fc} vd v13 v14 v15 v16 FC10{ m Fp FC11{ m FC12{ m Fp Fi FC13{ m}} Fi} FC12 FC12 Fi} Fp Fc Fi} v12} FC14{ BC15{ BC7 vd v19 v20 v21 v22 FC10 Fp Fc Fi} v17 v18 Fp FC16{ BC17{ m Fp FC18{ m FC19{ m FL[2]}} FC18 Fi[3] Fc[2] Fi Fp} FC12 FC12 FL}} FC20{ BC6 v23 v24} FC21{ BC7 BC22{ vd v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 v47 v48 v49 v50 Fp FC11 FC23{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC24{ m Fc Fi[2] Fp}} vd v25 v26} Fp Fi FC12 FC25{ vd m FC26{ vd m FC27{ m Fp Fi FC28{ m}} FC27 FC27 FC27 FC27 FL[2] Fi[3]} FC12 FC29{ vd m FL[2] Fi[3]} Fi} FC30{ BC31{ vd m FC32{ m Fp Fi[2] FC28} FC32} vd}}


 S10097C1 ::~S10097C1(){ note_dtor("S10097C1", this);}
void  S10097C1 ::v1(){vfunc_called(this, "_ZN8S10097C12v1Ev");}
void  S10097C1 ::v2(){vfunc_called(this, "_ZN8S10097C12v2Ev");}
void  S10097C1 ::v3(){vfunc_called(this, "_ZN8S10097C12v3Ev");}
void  S10097C1 ::v4(){vfunc_called(this, "_ZN8S10097C12v4Ev");}
void  S10097C1 ::v5(){vfunc_called(this, "_ZN8S10097C12v5Ev");}
S10097C1 ::S10097C1(){ note_ctor("S10097C1", this);} // tgen

static void Test_S10097C1()
{
  extern Class_Descriptor cd_S10097C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(132,181)];
    init_test(&cd_S10097C1, buf);
    S10097C1 *dp, &lv = *(dp=new (buf) S10097C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1048,720), "sizeof(S10097C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10097C1)");
    check_base_class_offset(lv, (S10097C2*), 0, "S10097C1");
    check_base_class_offset(lv, (S10097C3*), ABISELECT(8,4), "S10097C1");
    check_base_class_offset(lv, (S10098C4*), ABISELECT(24,12), "S10097C1");
    check_field_offset(lv, s10097c1f0, ABISELECT(72,36), "S10097C1.s10097c1f0");
    check_field_offset(lv, s10097c1f1, ABISELECT(208,128), "S10097C1.s10097c1f1");
    check_field_offset(lv, s10097c1f2, ABISELECT(464,316), "S10097C1.s10097c1f2");
    check_field_offset(lv, s10097c1f3, ABISELECT(600,408), "S10097C1.s10097c1f3");
    check_field_offset(lv, s10097c1f4, ABISELECT(768,520), "S10097C1.s10097c1f4");
    check_field_offset(lv, s10097c1f5, ABISELECT(776,524), "S10097C1.s10097c1f5");
    check_field_offset(lv, s10097c1f6, ABISELECT(784,528), "S10097C1.s10097c1f6");
    check_field_offset(lv, s10097c1f7, ABISELECT(800,540), "S10097C1.s10097c1f7");
    check_field_offset(lv, s10097c1f8, ABISELECT(992,684), "S10097C1.s10097c1f8");
    test_class_info(&lv, &cd_S10097C1);
    dp->~S10097C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10097C1(Test_S10097C1, "S10097C1", ABISELECT(1048,720));

#else // __cplusplus

extern void _ZN8S10097C1C1Ev();
extern void _ZN8S10097C1D1Ev();
Name_Map name_map_S10097C1[] = {
  NSPAIR(_ZN8S10097C1C1Ev),
  NSPAIR(_ZN8S10097C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10097C2;
extern VTBL_ENTRY _ZTI8S10097C2[];
extern  VTBL_ENTRY _ZTV8S10097C2[];
extern Class_Descriptor cd_S10097C3;
extern VTBL_ENTRY _ZTI8S10097C3[];
extern  VTBL_ENTRY _ZTV8S10097C3[];
extern Class_Descriptor cd_S10098C4;
extern VTBL_ENTRY _ZTI8S10098C4[];
extern  VTBL_ENTRY _ZTV8S10098C4[];
static Base_Class bases_S10097C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10097C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10097C3,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10098C4,    ABISELECT(24,12), //bcp->offset
    19, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10097C1[];
extern void _ZN8S10097C1D1Ev();
extern void _ZN8S10097C1D0Ev();
extern void _ZN8S10097C22v6Ev();
extern void _ZN8S10097C12v1Ev();
extern void _ZN8S10097C12v2Ev();
extern void _ZN8S10097C12v3Ev();
extern void _ZN8S10097C12v4Ev();
extern void _ZN8S10097C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10097C1D1Ev,_ZThn4_N8S10097C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10097C1D0Ev,_ZThn4_N8S10097C1D0Ev)();
extern void _ZN8S10097C32v7Ev();
extern void _ZN8S10097C32v8Ev();
extern void _ZN8S10097C32v9Ev();
extern void _ZN8S10097C33v10Ev();
extern void _ZN8S10097C33v11Ev();
extern void ABISELECT(_ZThn24_N8S10097C1D1Ev,_ZThn12_N8S10097C1D1Ev)();
extern void ABISELECT(_ZThn24_N8S10097C1D0Ev,_ZThn12_N8S10097C1D0Ev)();
static  VTBL_ENTRY vtc_S10097C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10097C1[0]),
  (VTBL_ENTRY)&_ZN8S10097C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10097C1D0Ev,
  (VTBL_ENTRY)&_ZN8S10097C22v6Ev,
  (VTBL_ENTRY)&_ZN8S10097C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10097C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10097C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10097C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10097C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10097C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10097C1D1Ev,_ZThn4_N8S10097C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10097C1D0Ev,_ZThn4_N8S10097C1D0Ev),
  (VTBL_ENTRY)&_ZN8S10097C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10097C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10097C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10097C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10097C33v11Ev,
  ABISELECT(-24,-12),
  (VTBL_ENTRY)&(_ZTI8S10097C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn24_N8S10097C1D1Ev,_ZThn12_N8S10097C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn24_N8S10097C1D0Ev,_ZThn12_N8S10097C1D0Ev),
};
extern VTBL_ENTRY _ZTI8S10097C1[];
extern  VTBL_ENTRY _ZTV8S10097C1[];
Class_Descriptor cd_S10097C1 = {  "S10097C1", // class name
  bases_S10097C1, 3,
  &(vtc_S10097C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1048,720), // object size
  NSPAIRA(_ZTI8S10097C1),ABISELECT(72,40), //typeinfo_var
  NSPAIRA(_ZTV8S10097C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C5  {
  void *s679c5f0[2];
  ::S10103C13_nt s679c5f1;
  void *s679c5f2;
  virtual  ~S679C5(); // _ZN6S679C5D1Ev
  virtual void  v6(); // _ZN6S679C52v6Ev
  virtual void  v7(); // _ZN6S679C52v7Ev
  virtual void  v8(); // _ZN6S679C52v8Ev
  virtual void  v9(); // _ZN6S679C52v9Ev
  virtual void  v10(); // _ZN6S679C53v10Ev
  virtual void  v11(); // _ZN6S679C53v11Ev
  virtual void  v12(); // _ZN6S679C53v12Ev
  virtual void  v13(); // _ZN6S679C53v13Ev
  virtual void  v14(); // _ZN6S679C53v14Ev
  virtual void  v15(); // _ZN6S679C53v15Ev
  S679C5(); // tgen
};
//SIG(-1 S679C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S679C5 ::~S679C5(){ note_dtor("S679C5", this);}
void  S679C5 ::v6(){vfunc_called(this, "_ZN6S679C52v6Ev");}
void  S679C5 ::v7(){vfunc_called(this, "_ZN6S679C52v7Ev");}
void  S679C5 ::v8(){vfunc_called(this, "_ZN6S679C52v8Ev");}
void  S679C5 ::v9(){vfunc_called(this, "_ZN6S679C52v9Ev");}
void  S679C5 ::v10(){vfunc_called(this, "_ZN6S679C53v10Ev");}
void  S679C5 ::v11(){vfunc_called(this, "_ZN6S679C53v11Ev");}
void  S679C5 ::v12(){vfunc_called(this, "_ZN6S679C53v12Ev");}
void  S679C5 ::v13(){vfunc_called(this, "_ZN6S679C53v13Ev");}
void  S679C5 ::v14(){vfunc_called(this, "_ZN6S679C53v14Ev");}
void  S679C5 ::v15(){vfunc_called(this, "_ZN6S679C53v15Ev");}
S679C5 ::S679C5(){ note_ctor("S679C5", this);} // tgen

static void Test_S679C5()
{
  extern Class_Descriptor cd_S679C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S679C5, buf);
    S679C5 *dp, &lv = *(dp=new (buf) S679C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S679C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C5)");
    check_field_offset(lv, s679c5f0, ABISELECT(8,4), "S679C5.s679c5f0");
    check_field_offset(lv, s679c5f1, ABISELECT(24,12), "S679C5.s679c5f1");
    check_field_offset(lv, s679c5f2, ABISELECT(48,28), "S679C5.s679c5f2");
    test_class_info(&lv, &cd_S679C5);
    dp->~S679C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C5(Test_S679C5, "S679C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S679C5C1Ev();
extern void _ZN6S679C5D1Ev();
Name_Map name_map_S679C5[] = {
  NSPAIR(_ZN6S679C5C1Ev),
  NSPAIR(_ZN6S679C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S679C5[];
extern void _ZN6S679C5D1Ev();
extern void _ZN6S679C5D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
static  VTBL_ENTRY vtc_S679C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S679C5[0]),
  (VTBL_ENTRY)&_ZN6S679C5D1Ev,
  (VTBL_ENTRY)&_ZN6S679C5D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
};
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
Class_Descriptor cd_S679C5 = {  "S679C5", // class name
  0,0,//no base classes
  &(vtc_S679C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S679C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S679C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C4  : S679C5 {
  ::S10103C86 s679c4f0;
  ::S10103C106 s679c4f1;
  ::S10103C82_nt s679c4f2;
  ::S10103C13_nt s679c4f3;
  virtual  ~S679C4(); // _ZN6S679C4D1Ev
  virtual void  v16(); // _ZN6S679C43v16Ev
  virtual void  v17(); // _ZN6S679C43v17Ev
  virtual void  v18(); // _ZN6S679C43v18Ev
  virtual void  v19(); // _ZN6S679C43v19Ev
  virtual void  v20(); // _ZN6S679C43v20Ev
  virtual void  v21(); // _ZN6S679C43v21Ev
  virtual void  v22(); // _ZN6S679C43v22Ev
  virtual void  v23(); // _ZN6S679C43v23Ev
  virtual void  v24(); // _ZN6S679C43v24Ev
  virtual void  v25(); // _ZN6S679C43v25Ev
  virtual void  v26(); // _ZN6S679C43v26Ev
  virtual void  v27(); // _ZN6S679C43v27Ev
  virtual void  v28(); // _ZN6S679C43v28Ev
  virtual void  v29(); // _ZN6S679C43v29Ev
  S679C4(); // tgen
};
//SIG(-1 S679C4) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S679C4 ::~S679C4(){ note_dtor("S679C4", this);}
void  S679C4 ::v16(){vfunc_called(this, "_ZN6S679C43v16Ev");}
void  S679C4 ::v17(){vfunc_called(this, "_ZN6S679C43v17Ev");}
void  S679C4 ::v18(){vfunc_called(this, "_ZN6S679C43v18Ev");}
void  S679C4 ::v19(){vfunc_called(this, "_ZN6S679C43v19Ev");}
void  S679C4 ::v20(){vfunc_called(this, "_ZN6S679C43v20Ev");}
void  S679C4 ::v21(){vfunc_called(this, "_ZN6S679C43v21Ev");}
void  S679C4 ::v22(){vfunc_called(this, "_ZN6S679C43v22Ev");}
void  S679C4 ::v23(){vfunc_called(this, "_ZN6S679C43v23Ev");}
void  S679C4 ::v24(){vfunc_called(this, "_ZN6S679C43v24Ev");}
void  S679C4 ::v25(){vfunc_called(this, "_ZN6S679C43v25Ev");}
void  S679C4 ::v26(){vfunc_called(this, "_ZN6S679C43v26Ev");}
void  S679C4 ::v27(){vfunc_called(this, "_ZN6S679C43v27Ev");}
void  S679C4 ::v28(){vfunc_called(this, "_ZN6S679C43v28Ev");}
void  S679C4 ::v29(){vfunc_called(this, "_ZN6S679C43v29Ev");}
S679C4 ::S679C4(){ note_ctor("S679C4", this);} // tgen

static void Test_S679C4()
{
  extern Class_Descriptor cd_S679C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S679C4, buf);
    S679C4 *dp, &lv = *(dp=new (buf) S679C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S679C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C4)");
    check_base_class_offset(lv, (S679C5*), 0, "S679C4");
    check_field_offset(lv, s679c4f0, ABISELECT(56,32), "S679C4.s679c4f0");
    check_field_offset(lv, s679c4f1, ABISELECT(72,44), "S679C4.s679c4f1");
    check_field_offset(lv, s679c4f2, ABISELECT(96,60), "S679C4.s679c4f2");
    check_field_offset(lv, s679c4f3, ABISELECT(112,76), "S679C4.s679c4f3");
    test_class_info(&lv, &cd_S679C4);
    dp->~S679C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C4(Test_S679C4, "S679C4", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN6S679C4C1Ev();
extern void _ZN6S679C4D1Ev();
Name_Map name_map_S679C4[] = {
  NSPAIR(_ZN6S679C4C1Ev),
  NSPAIR(_ZN6S679C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S679C5;
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
static Base_Class bases_S679C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S679C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S679C4[];
extern void _ZN6S679C4D1Ev();
extern void _ZN6S679C4D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
extern void _ZN6S679C43v16Ev();
extern void _ZN6S679C43v17Ev();
extern void _ZN6S679C43v18Ev();
extern void _ZN6S679C43v19Ev();
extern void _ZN6S679C43v20Ev();
extern void _ZN6S679C43v21Ev();
extern void _ZN6S679C43v22Ev();
extern void _ZN6S679C43v23Ev();
extern void _ZN6S679C43v24Ev();
extern void _ZN6S679C43v25Ev();
extern void _ZN6S679C43v26Ev();
extern void _ZN6S679C43v27Ev();
extern void _ZN6S679C43v28Ev();
extern void _ZN6S679C43v29Ev();
static  VTBL_ENTRY vtc_S679C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S679C4[0]),
  (VTBL_ENTRY)&_ZN6S679C4D1Ev,
  (VTBL_ENTRY)&_ZN6S679C4D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
  (VTBL_ENTRY)&_ZN6S679C43v16Ev,
  (VTBL_ENTRY)&_ZN6S679C43v17Ev,
  (VTBL_ENTRY)&_ZN6S679C43v18Ev,
  (VTBL_ENTRY)&_ZN6S679C43v19Ev,
  (VTBL_ENTRY)&_ZN6S679C43v20Ev,
  (VTBL_ENTRY)&_ZN6S679C43v21Ev,
  (VTBL_ENTRY)&_ZN6S679C43v22Ev,
  (VTBL_ENTRY)&_ZN6S679C43v23Ev,
  (VTBL_ENTRY)&_ZN6S679C43v24Ev,
  (VTBL_ENTRY)&_ZN6S679C43v25Ev,
  (VTBL_ENTRY)&_ZN6S679C43v26Ev,
  (VTBL_ENTRY)&_ZN6S679C43v27Ev,
  (VTBL_ENTRY)&_ZN6S679C43v28Ev,
  (VTBL_ENTRY)&_ZN6S679C43v29Ev,
};
extern VTBL_ENTRY _ZTI6S679C4[];
extern  VTBL_ENTRY _ZTV6S679C4[];
Class_Descriptor cd_S679C4 = {  "S679C4", // class name
  bases_S679C4, 1,
  &(vtc_S679C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI6S679C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S679C4),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C3  : S679C4 {
  int s679c3f0;
  char s679c3f1[2];
  int s679c3f2;
  virtual void  v30(); // _ZN6S679C33v30Ev
  virtual void  v31(); // _ZN6S679C33v31Ev
  virtual void  v32(); // _ZN6S679C33v32Ev
  virtual void  v33(); // _ZN6S679C33v33Ev
  ~S679C3(); // tgen
  S679C3(); // tgen
};
//SIG(-1 S679C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 Fi Fc[2] Fi}


void  S679C3 ::v30(){vfunc_called(this, "_ZN6S679C33v30Ev");}
void  S679C3 ::v31(){vfunc_called(this, "_ZN6S679C33v31Ev");}
void  S679C3 ::v32(){vfunc_called(this, "_ZN6S679C33v32Ev");}
void  S679C3 ::v33(){vfunc_called(this, "_ZN6S679C33v33Ev");}
S679C3 ::~S679C3(){ note_dtor("S679C3", this);} // tgen
S679C3 ::S679C3(){ note_ctor("S679C3", this);} // tgen

static void Test_S679C3()
{
  extern Class_Descriptor cd_S679C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S679C3, buf);
    S679C3 *dp, &lv = *(dp=new (buf) S679C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S679C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C3)");
    check_base_class_offset(lv, (S679C5*)(S679C4*), 0, "S679C3");
    check_base_class_offset(lv, (S679C4*), 0, "S679C3");
    check_field_offset(lv, s679c3f0, ABISELECT(136,92), "S679C3.s679c3f0");
    check_field_offset(lv, s679c3f1, ABISELECT(140,96), "S679C3.s679c3f1");
    check_field_offset(lv, s679c3f2, ABISELECT(144,100), "S679C3.s679c3f2");
    test_class_info(&lv, &cd_S679C3);
    dp->~S679C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C3(Test_S679C3, "S679C3", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN6S679C3C1Ev();
extern void _ZN6S679C3D1Ev();
Name_Map name_map_S679C3[] = {
  NSPAIR(_ZN6S679C3C1Ev),
  NSPAIR(_ZN6S679C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S679C5;
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
extern Class_Descriptor cd_S679C4;
extern VTBL_ENTRY _ZTI6S679C4[];
extern  VTBL_ENTRY _ZTV6S679C4[];
static Base_Class bases_S679C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S679C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S679C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S679C3[];
extern void _ZN6S679C3D1Ev();
extern void _ZN6S679C3D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
extern void _ZN6S679C43v16Ev();
extern void _ZN6S679C43v17Ev();
extern void _ZN6S679C43v18Ev();
extern void _ZN6S679C43v19Ev();
extern void _ZN6S679C43v20Ev();
extern void _ZN6S679C43v21Ev();
extern void _ZN6S679C43v22Ev();
extern void _ZN6S679C43v23Ev();
extern void _ZN6S679C43v24Ev();
extern void _ZN6S679C43v25Ev();
extern void _ZN6S679C43v26Ev();
extern void _ZN6S679C43v27Ev();
extern void _ZN6S679C43v28Ev();
extern void _ZN6S679C43v29Ev();
extern void _ZN6S679C33v30Ev();
extern void _ZN6S679C33v31Ev();
extern void _ZN6S679C33v32Ev();
extern void _ZN6S679C33v33Ev();
static  VTBL_ENTRY vtc_S679C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S679C3[0]),
  (VTBL_ENTRY)&_ZN6S679C3D1Ev,
  (VTBL_ENTRY)&_ZN6S679C3D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
  (VTBL_ENTRY)&_ZN6S679C43v16Ev,
  (VTBL_ENTRY)&_ZN6S679C43v17Ev,
  (VTBL_ENTRY)&_ZN6S679C43v18Ev,
  (VTBL_ENTRY)&_ZN6S679C43v19Ev,
  (VTBL_ENTRY)&_ZN6S679C43v20Ev,
  (VTBL_ENTRY)&_ZN6S679C43v21Ev,
  (VTBL_ENTRY)&_ZN6S679C43v22Ev,
  (VTBL_ENTRY)&_ZN6S679C43v23Ev,
  (VTBL_ENTRY)&_ZN6S679C43v24Ev,
  (VTBL_ENTRY)&_ZN6S679C43v25Ev,
  (VTBL_ENTRY)&_ZN6S679C43v26Ev,
  (VTBL_ENTRY)&_ZN6S679C43v27Ev,
  (VTBL_ENTRY)&_ZN6S679C43v28Ev,
  (VTBL_ENTRY)&_ZN6S679C43v29Ev,
  (VTBL_ENTRY)&_ZN6S679C33v30Ev,
  (VTBL_ENTRY)&_ZN6S679C33v31Ev,
  (VTBL_ENTRY)&_ZN6S679C33v32Ev,
  (VTBL_ENTRY)&_ZN6S679C33v33Ev,
};
extern VTBL_ENTRY _ZTI6S679C3[];
extern  VTBL_ENTRY _ZTV6S679C3[];
Class_Descriptor cd_S679C3 = {  "S679C3", // class name
  bases_S679C3, 2,
  &(vtc_S679C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI6S679C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S679C3),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C17  : S679C5 {
  void *s679c17f0;
  int s679c17f1;
  ::S10103C35 s679c17f2;
  ::S10103C82_nt s679c17f3;
  int s679c17f4;
  virtual  ~S679C17(); // _ZN7S679C17D1Ev
  virtual void  v42(); // _ZN7S679C173v42Ev
  virtual void  v43(); // _ZN7S679C173v43Ev
  virtual void  v44(); // _ZN7S679C173v44Ev
  virtual void  v45(); // _ZN7S679C173v45Ev
  virtual void  v46(); // _ZN7S679C173v46Ev
  virtual void  v47(); // _ZN7S679C173v47Ev
  S679C17(); // tgen
};
//SIG(-1 S679C17) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp Fi FC6{ m Fp Fi FC7{ m} FC7} FC8{ m FC9{ m FL[2]}} Fi}


 S679C17 ::~S679C17(){ note_dtor("S679C17", this);}
void  S679C17 ::v42(){vfunc_called(this, "_ZN7S679C173v42Ev");}
void  S679C17 ::v43(){vfunc_called(this, "_ZN7S679C173v43Ev");}
void  S679C17 ::v44(){vfunc_called(this, "_ZN7S679C173v44Ev");}
void  S679C17 ::v45(){vfunc_called(this, "_ZN7S679C173v45Ev");}
void  S679C17 ::v46(){vfunc_called(this, "_ZN7S679C173v46Ev");}
void  S679C17 ::v47(){vfunc_called(this, "_ZN7S679C173v47Ev");}
S679C17 ::S679C17(){ note_ctor("S679C17", this);} // tgen

static void Test_S679C17()
{
  extern Class_Descriptor cd_S679C17;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,19)];
    init_test(&cd_S679C17, buf);
    S679C17 *dp, &lv = *(dp=new (buf) S679C17());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,72), "sizeof(S679C17)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C17)");
    check_base_class_offset(lv, (S679C5*), 0, "S679C17");
    check_field_offset(lv, s679c17f0, ABISELECT(56,32), "S679C17.s679c17f0");
    check_field_offset(lv, s679c17f1, ABISELECT(64,36), "S679C17.s679c17f1");
    check_field_offset(lv, s679c17f2, ABISELECT(72,40), "S679C17.s679c17f2");
    check_field_offset(lv, s679c17f3, ABISELECT(88,52), "S679C17.s679c17f3");
    check_field_offset(lv, s679c17f4, ABISELECT(104,68), "S679C17.s679c17f4");
    test_class_info(&lv, &cd_S679C17);
    dp->~S679C17();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C17(Test_S679C17, "S679C17", ABISELECT(112,72));

#else // __cplusplus

extern void _ZN7S679C17C1Ev();
extern void _ZN7S679C17D1Ev();
Name_Map name_map_S679C17[] = {
  NSPAIR(_ZN7S679C17C1Ev),
  NSPAIR(_ZN7S679C17D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S679C5;
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
static Base_Class bases_S679C17[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S679C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S679C17[];
extern void _ZN7S679C17D1Ev();
extern void _ZN7S679C17D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
extern void _ZN7S679C173v42Ev();
extern void _ZN7S679C173v43Ev();
extern void _ZN7S679C173v44Ev();
extern void _ZN7S679C173v45Ev();
extern void _ZN7S679C173v46Ev();
extern void _ZN7S679C173v47Ev();
static  VTBL_ENTRY vtc_S679C17[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S679C17[0]),
  (VTBL_ENTRY)&_ZN7S679C17D1Ev,
  (VTBL_ENTRY)&_ZN7S679C17D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
  (VTBL_ENTRY)&_ZN7S679C173v42Ev,
  (VTBL_ENTRY)&_ZN7S679C173v43Ev,
  (VTBL_ENTRY)&_ZN7S679C173v44Ev,
  (VTBL_ENTRY)&_ZN7S679C173v45Ev,
  (VTBL_ENTRY)&_ZN7S679C173v46Ev,
  (VTBL_ENTRY)&_ZN7S679C173v47Ev,
};
extern VTBL_ENTRY _ZTI7S679C17[];
extern  VTBL_ENTRY _ZTV7S679C17[];
Class_Descriptor cd_S679C17 = {  "S679C17", // class name
  bases_S679C17, 1,
  &(vtc_S679C17[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(112,72), // object size
  NSPAIRA(_ZTI7S679C17),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S679C17),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C21_nt  {
  ::S10103C83_nt s679c21f0;
  void  mf679c21(); // _ZN10S679C21_nt8mf679c21Ev
};
//SIG(-1 S679C21_nt) C1{ m FC2{ m FL[2]}}


void  S679C21_nt ::mf679c21(){}

//skip512 S679C21_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C23  : S679C17 {
  ::S679C21_nt s679c23f0;
  ::S679C21_nt s679c23f1;
  int s679c23f2[6];
  ::S10103C30_nt s679c23f3;
  ::S10103C30_nt s679c23f4;
  char s679c23f5[7];
  int s679c23f6[2];
  ::S10103C82_nt s679c23f7;
  ::S10103C82_nt s679c23f8;
  ::S10103C82_nt s679c23f9;
  ::S10103C82_nt s679c23f10;
  ::S10103C82_nt s679c23f11;
  char s679c23f12[7];
  virtual  ~S679C23(); // _ZN7S679C23D1Ev
  virtual void  v48(); // _ZN7S679C233v48Ev
  virtual void  v49(); // _ZN7S679C233v49Ev
  virtual void  v50(); // _ZN7S679C233v50Ev
  virtual void  v51(); // _ZN7S679C233v51Ev
  S679C23(); // tgen
};
//SIG(-1 S679C23) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 Fp Fi FC7{ m Fp Fi FC8{ m} FC8} FC9{ m FC10{ m FL[2]}} Fi} vd v1 v2 v3 v4 FC11{ m FC10} FC11 Fi[6] FC12{ m FC13{ m FL}} FC12 Fc[7] Fi[2] FC9 FC9 FC9 FC9 FC9 Fc[7]}


 S679C23 ::~S679C23(){ note_dtor("S679C23", this);}
void  S679C23 ::v48(){vfunc_called(this, "_ZN7S679C233v48Ev");}
void  S679C23 ::v49(){vfunc_called(this, "_ZN7S679C233v49Ev");}
void  S679C23 ::v50(){vfunc_called(this, "_ZN7S679C233v50Ev");}
void  S679C23 ::v51(){vfunc_called(this, "_ZN7S679C233v51Ev");}
S679C23 ::S679C23(){ note_ctor("S679C23", this);} // tgen

static void Test_S679C23()
{
  extern Class_Descriptor cd_S679C23;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(37,63)];
    init_test(&cd_S679C23, buf);
    S679C23 *dp, &lv = *(dp=new (buf) S679C23());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(288,248), "sizeof(S679C23)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C23)");
    check_base_class_offset(lv, (S679C5*)(S679C17*), 0, "S679C23");
    check_base_class_offset(lv, (S679C17*), 0, "S679C23");
    check_field_offset(lv, s679c23f0, ABISELECT(112,72), "S679C23.s679c23f0");
    check_field_offset(lv, s679c23f1, ABISELECT(128,88), "S679C23.s679c23f1");
    check_field_offset(lv, s679c23f2, ABISELECT(144,104), "S679C23.s679c23f2");
    check_field_offset(lv, s679c23f3, ABISELECT(168,128), "S679C23.s679c23f3");
    check_field_offset(lv, s679c23f4, ABISELECT(176,136), "S679C23.s679c23f4");
    check_field_offset(lv, s679c23f5, ABISELECT(184,144), "S679C23.s679c23f5");
    check_field_offset(lv, s679c23f6, ABISELECT(192,152), "S679C23.s679c23f6");
    check_field_offset(lv, s679c23f7, ABISELECT(200,160), "S679C23.s679c23f7");
    check_field_offset(lv, s679c23f8, ABISELECT(216,176), "S679C23.s679c23f8");
    check_field_offset(lv, s679c23f9, ABISELECT(232,192), "S679C23.s679c23f9");
    check_field_offset(lv, s679c23f10, ABISELECT(248,208), "S679C23.s679c23f10");
    check_field_offset(lv, s679c23f11, ABISELECT(264,224), "S679C23.s679c23f11");
    check_field_offset(lv, s679c23f12, ABISELECT(280,240), "S679C23.s679c23f12");
    test_class_info(&lv, &cd_S679C23);
    dp->~S679C23();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C23(Test_S679C23, "S679C23", ABISELECT(288,248));

#else // __cplusplus

extern void _ZN7S679C23C1Ev();
extern void _ZN7S679C23D1Ev();
Name_Map name_map_S679C23[] = {
  NSPAIR(_ZN7S679C23C1Ev),
  NSPAIR(_ZN7S679C23D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S679C5;
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
extern Class_Descriptor cd_S679C17;
extern VTBL_ENTRY _ZTI7S679C17[];
extern  VTBL_ENTRY _ZTV7S679C17[];
static Base_Class bases_S679C23[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S679C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S679C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S679C23[];
extern void _ZN7S679C23D1Ev();
extern void _ZN7S679C23D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
extern void _ZN7S679C173v42Ev();
extern void _ZN7S679C173v43Ev();
extern void _ZN7S679C173v44Ev();
extern void _ZN7S679C173v45Ev();
extern void _ZN7S679C173v46Ev();
extern void _ZN7S679C173v47Ev();
extern void _ZN7S679C233v48Ev();
extern void _ZN7S679C233v49Ev();
extern void _ZN7S679C233v50Ev();
extern void _ZN7S679C233v51Ev();
static  VTBL_ENTRY vtc_S679C23[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S679C23[0]),
  (VTBL_ENTRY)&_ZN7S679C23D1Ev,
  (VTBL_ENTRY)&_ZN7S679C23D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
  (VTBL_ENTRY)&_ZN7S679C173v42Ev,
  (VTBL_ENTRY)&_ZN7S679C173v43Ev,
  (VTBL_ENTRY)&_ZN7S679C173v44Ev,
  (VTBL_ENTRY)&_ZN7S679C173v45Ev,
  (VTBL_ENTRY)&_ZN7S679C173v46Ev,
  (VTBL_ENTRY)&_ZN7S679C173v47Ev,
  (VTBL_ENTRY)&_ZN7S679C233v48Ev,
  (VTBL_ENTRY)&_ZN7S679C233v49Ev,
  (VTBL_ENTRY)&_ZN7S679C233v50Ev,
  (VTBL_ENTRY)&_ZN7S679C233v51Ev,
};
extern VTBL_ENTRY _ZTI7S679C23[];
extern  VTBL_ENTRY _ZTV7S679C23[];
Class_Descriptor cd_S679C23 = {  "S679C23", // class name
  bases_S679C23, 2,
  &(vtc_S679C23[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(288,248), // object size
  NSPAIRA(_ZTI7S679C23),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S679C23),24, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C2  : S679C3 {
  ::S10103C84 s679c2f0;
  ::S679C23 s679c2f1;
  ::S10103C84 s679c2f2;
  ::S10103C84 s679c2f3;
  int s679c2f4;
  void *s679c2f5;
  int s679c2f6[2];
  virtual  ~S679C2(); // _ZN6S679C2D1Ev
  virtual void  v34(); // _ZN6S679C23v34Ev
  virtual void  v35(); // _ZN6S679C23v35Ev
  virtual void  v36(); // _ZN6S679C23v36Ev
  virtual void  v37(); // _ZN6S679C23v37Ev
  S679C2(); // tgen
};
//SIG(-1 S679C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 Fi Fc[2] Fi} vd v1 v2 v3 v4 FC14{ BC15{ BC16{ vd v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 Fp[2] FC5 Fp} vd v47 v48 v49 v50 v51 v52 Fp Fi FC8 FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC17{ BC18{ BC4 vd v57 v58 v59 v60 v61 v62 Fp Fi FC19{ m Fp Fi FC20{ m} FC20} FC12 Fi} vd v53 v54 v55 v56 FC21{ m FC13} FC21 Fi[6] FC22{ m FC23{ m FL}} FC22 Fc[7] Fi[2] FC12 FC12 FC12 FC12 FC12 Fc[7]} FC14 FC14 Fi Fp Fi[2]}


 S679C2 ::~S679C2(){ note_dtor("S679C2", this);}
void  S679C2 ::v34(){vfunc_called(this, "_ZN6S679C23v34Ev");}
void  S679C2 ::v35(){vfunc_called(this, "_ZN6S679C23v35Ev");}
void  S679C2 ::v36(){vfunc_called(this, "_ZN6S679C23v36Ev");}
void  S679C2 ::v37(){vfunc_called(this, "_ZN6S679C23v37Ev");}
S679C2 ::S679C2(){ note_ctor("S679C2", this);} // tgen

static void Test_S679C2()
{
  extern Class_Descriptor cd_S679C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(170,261)];
    init_test(&cd_S679C2, buf);
    S679C2 *dp, &lv = *(dp=new (buf) S679C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1352,1040), "sizeof(S679C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C2)");
    check_base_class_offset(lv, (S679C5*)(S679C4*)(S679C3*), 0, "S679C2");
    check_base_class_offset(lv, (S679C4*)(S679C3*), 0, "S679C2");
    check_base_class_offset(lv, (S679C3*), 0, "S679C2");
    check_field_offset(lv, s679c2f0, ABISELECT(152,104), "S679C2.s679c2f0");
    check_field_offset(lv, s679c2f1, ABISELECT(448,328), "S679C2.s679c2f1");
    check_field_offset(lv, s679c2f2, ABISELECT(736,576), "S679C2.s679c2f2");
    check_field_offset(lv, s679c2f3, ABISELECT(1032,800), "S679C2.s679c2f3");
    check_field_offset(lv, s679c2f4, ABISELECT(1328,1024), "S679C2.s679c2f4");
    check_field_offset(lv, s679c2f5, ABISELECT(1336,1028), "S679C2.s679c2f5");
    check_field_offset(lv, s679c2f6, ABISELECT(1344,1032), "S679C2.s679c2f6");
    test_class_info(&lv, &cd_S679C2);
    dp->~S679C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C2(Test_S679C2, "S679C2", ABISELECT(1352,1040));

#else // __cplusplus

extern void _ZN6S679C2C1Ev();
extern void _ZN6S679C2D1Ev();
Name_Map name_map_S679C2[] = {
  NSPAIR(_ZN6S679C2C1Ev),
  NSPAIR(_ZN6S679C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S679C5;
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
extern Class_Descriptor cd_S679C4;
extern VTBL_ENTRY _ZTI6S679C4[];
extern  VTBL_ENTRY _ZTV6S679C4[];
extern Class_Descriptor cd_S679C3;
extern VTBL_ENTRY _ZTI6S679C3[];
extern  VTBL_ENTRY _ZTV6S679C3[];
static Base_Class bases_S679C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S679C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S679C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S679C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S679C2[];
extern void _ZN6S679C2D1Ev();
extern void _ZN6S679C2D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
extern void _ZN6S679C43v16Ev();
extern void _ZN6S679C43v17Ev();
extern void _ZN6S679C43v18Ev();
extern void _ZN6S679C43v19Ev();
extern void _ZN6S679C43v20Ev();
extern void _ZN6S679C43v21Ev();
extern void _ZN6S679C43v22Ev();
extern void _ZN6S679C43v23Ev();
extern void _ZN6S679C43v24Ev();
extern void _ZN6S679C43v25Ev();
extern void _ZN6S679C43v26Ev();
extern void _ZN6S679C43v27Ev();
extern void _ZN6S679C43v28Ev();
extern void _ZN6S679C43v29Ev();
extern void _ZN6S679C33v30Ev();
extern void _ZN6S679C33v31Ev();
extern void _ZN6S679C33v32Ev();
extern void _ZN6S679C33v33Ev();
extern void _ZN6S679C23v34Ev();
extern void _ZN6S679C23v35Ev();
extern void _ZN6S679C23v36Ev();
extern void _ZN6S679C23v37Ev();
static  VTBL_ENTRY vtc_S679C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S679C2[0]),
  (VTBL_ENTRY)&_ZN6S679C2D1Ev,
  (VTBL_ENTRY)&_ZN6S679C2D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
  (VTBL_ENTRY)&_ZN6S679C43v16Ev,
  (VTBL_ENTRY)&_ZN6S679C43v17Ev,
  (VTBL_ENTRY)&_ZN6S679C43v18Ev,
  (VTBL_ENTRY)&_ZN6S679C43v19Ev,
  (VTBL_ENTRY)&_ZN6S679C43v20Ev,
  (VTBL_ENTRY)&_ZN6S679C43v21Ev,
  (VTBL_ENTRY)&_ZN6S679C43v22Ev,
  (VTBL_ENTRY)&_ZN6S679C43v23Ev,
  (VTBL_ENTRY)&_ZN6S679C43v24Ev,
  (VTBL_ENTRY)&_ZN6S679C43v25Ev,
  (VTBL_ENTRY)&_ZN6S679C43v26Ev,
  (VTBL_ENTRY)&_ZN6S679C43v27Ev,
  (VTBL_ENTRY)&_ZN6S679C43v28Ev,
  (VTBL_ENTRY)&_ZN6S679C43v29Ev,
  (VTBL_ENTRY)&_ZN6S679C33v30Ev,
  (VTBL_ENTRY)&_ZN6S679C33v31Ev,
  (VTBL_ENTRY)&_ZN6S679C33v32Ev,
  (VTBL_ENTRY)&_ZN6S679C33v33Ev,
  (VTBL_ENTRY)&_ZN6S679C23v34Ev,
  (VTBL_ENTRY)&_ZN6S679C23v35Ev,
  (VTBL_ENTRY)&_ZN6S679C23v36Ev,
  (VTBL_ENTRY)&_ZN6S679C23v37Ev,
};
extern VTBL_ENTRY _ZTI6S679C2[];
extern  VTBL_ENTRY _ZTV6S679C2[];
Class_Descriptor cd_S679C2 = {  "S679C2", // class name
  bases_S679C2, 3,
  &(vtc_S679C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1352,1040), // object size
  NSPAIRA(_ZTI6S679C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S679C2),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S679C1  : S679C2 {
  ::S10103C84 s679c1f0;
  ::S10103C84 s679c1f1;
  int s679c1f2[3];
  virtual  ~S679C1(); // _ZN6S679C1D1Ev
  virtual void  v1(); // _ZN6S679C12v1Ev
  virtual void  v2(); // _ZN6S679C12v2Ev
  virtual void  v3(); // _ZN6S679C12v3Ev
  virtual void  v4(); // _ZN6S679C12v4Ev
  virtual void  v5(); // _ZN6S679C12v5Ev
  S679C1(); // tgen
};
//SIG(1 S679C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC12{ m Fp Fi[2] FC11} FC13{ m FC14{ m FL[2]}} FC6} v30 v31 v32 v33 Fi Fc[2] Fi} vd v34 v35 v36 v37 FC15{ BC16{ BC17{ vd v42 v43 v44 v45 v46 v47 v48 v49 v50 v51 Fp[2] FC6 Fp} vd v52 v53 v54 v55 v56 v57 Fp Fi FC9 FC13 Fi} vd v38 v39 v40 v41 FC6[4] FC13 FC13 FC13 FC13 Fi[6]} FC18{ BC19{ BC5 vd v62 v63 v64 v65 v66 v67 Fp Fi FC20{ m Fp Fi FC21{ m} FC21} FC13 Fi} vd v58 v59 v60 v61 FC22{ m FC14} FC22 Fi[6] FC23{ m FC24{ m FL}} FC23 Fc[7] Fi[2] FC13 FC13 FC13 FC13 FC13 Fc[7]} FC15 FC15 Fi Fp Fi[2]} vd v1 v2 v3 v4 v5 FC15 FC15 Fi[3]}


 S679C1 ::~S679C1(){ note_dtor("S679C1", this);}
void  S679C1 ::v1(){vfunc_called(this, "_ZN6S679C12v1Ev");}
void  S679C1 ::v2(){vfunc_called(this, "_ZN6S679C12v2Ev");}
void  S679C1 ::v3(){vfunc_called(this, "_ZN6S679C12v3Ev");}
void  S679C1 ::v4(){vfunc_called(this, "_ZN6S679C12v4Ev");}
void  S679C1 ::v5(){vfunc_called(this, "_ZN6S679C12v5Ev");}
S679C1 ::S679C1(){ note_ctor("S679C1", this);} // tgen

static void Test_S679C1()
{
  extern Class_Descriptor cd_S679C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(246,376)];
    init_test(&cd_S679C1, buf);
    S679C1 *dp, &lv = *(dp=new (buf) S679C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1960,1500), "sizeof(S679C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S679C1)");
    check_base_class_offset(lv, (S679C5*)(S679C4*)(S679C3*)(S679C2*), 0, "S679C1");
    check_base_class_offset(lv, (S679C4*)(S679C3*)(S679C2*), 0, "S679C1");
    check_base_class_offset(lv, (S679C3*)(S679C2*), 0, "S679C1");
    check_base_class_offset(lv, (S679C2*), 0, "S679C1");
    check_field_offset(lv, s679c1f0, ABISELECT(1352,1040), "S679C1.s679c1f0");
    check_field_offset(lv, s679c1f1, ABISELECT(1648,1264), "S679C1.s679c1f1");
    check_field_offset(lv, s679c1f2, ABISELECT(1944,1488), "S679C1.s679c1f2");
    test_class_info(&lv, &cd_S679C1);
    dp->~S679C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS679C1(Test_S679C1, "S679C1", ABISELECT(1960,1500));

#else // __cplusplus

extern void _ZN6S679C1C1Ev();
extern void _ZN6S679C1D1Ev();
Name_Map name_map_S679C1[] = {
  NSPAIR(_ZN6S679C1C1Ev),
  NSPAIR(_ZN6S679C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S679C5;
extern VTBL_ENTRY _ZTI6S679C5[];
extern  VTBL_ENTRY _ZTV6S679C5[];
extern Class_Descriptor cd_S679C4;
extern VTBL_ENTRY _ZTI6S679C4[];
extern  VTBL_ENTRY _ZTV6S679C4[];
extern Class_Descriptor cd_S679C3;
extern VTBL_ENTRY _ZTI6S679C3[];
extern  VTBL_ENTRY _ZTV6S679C3[];
extern Class_Descriptor cd_S679C2;
extern VTBL_ENTRY _ZTI6S679C2[];
extern  VTBL_ENTRY _ZTV6S679C2[];
static Base_Class bases_S679C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S679C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S679C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S679C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S679C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S679C1[];
extern void _ZN6S679C1D1Ev();
extern void _ZN6S679C1D0Ev();
extern void _ZN6S679C52v6Ev();
extern void _ZN6S679C52v7Ev();
extern void _ZN6S679C52v8Ev();
extern void _ZN6S679C52v9Ev();
extern void _ZN6S679C53v10Ev();
extern void _ZN6S679C53v11Ev();
extern void _ZN6S679C53v12Ev();
extern void _ZN6S679C53v13Ev();
extern void _ZN6S679C53v14Ev();
extern void _ZN6S679C53v15Ev();
extern void _ZN6S679C43v16Ev();
extern void _ZN6S679C43v17Ev();
extern void _ZN6S679C43v18Ev();
extern void _ZN6S679C43v19Ev();
extern void _ZN6S679C43v20Ev();
extern void _ZN6S679C43v21Ev();
extern void _ZN6S679C43v22Ev();
extern void _ZN6S679C43v23Ev();
extern void _ZN6S679C43v24Ev();
extern void _ZN6S679C43v25Ev();
extern void _ZN6S679C43v26Ev();
extern void _ZN6S679C43v27Ev();
extern void _ZN6S679C43v28Ev();
extern void _ZN6S679C43v29Ev();
extern void _ZN6S679C33v30Ev();
extern void _ZN6S679C33v31Ev();
extern void _ZN6S679C33v32Ev();
extern void _ZN6S679C33v33Ev();
extern void _ZN6S679C23v34Ev();
extern void _ZN6S679C23v35Ev();
extern void _ZN6S679C23v36Ev();
extern void _ZN6S679C23v37Ev();
extern void _ZN6S679C12v1Ev();
extern void _ZN6S679C12v2Ev();
extern void _ZN6S679C12v3Ev();
extern void _ZN6S679C12v4Ev();
extern void _ZN6S679C12v5Ev();
static  VTBL_ENTRY vtc_S679C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S679C1[0]),
  (VTBL_ENTRY)&_ZN6S679C1D1Ev,
  (VTBL_ENTRY)&_ZN6S679C1D0Ev,
  (VTBL_ENTRY)&_ZN6S679C52v6Ev,
  (VTBL_ENTRY)&_ZN6S679C52v7Ev,
  (VTBL_ENTRY)&_ZN6S679C52v8Ev,
  (VTBL_ENTRY)&_ZN6S679C52v9Ev,
  (VTBL_ENTRY)&_ZN6S679C53v10Ev,
  (VTBL_ENTRY)&_ZN6S679C53v11Ev,
  (VTBL_ENTRY)&_ZN6S679C53v12Ev,
  (VTBL_ENTRY)&_ZN6S679C53v13Ev,
  (VTBL_ENTRY)&_ZN6S679C53v14Ev,
  (VTBL_ENTRY)&_ZN6S679C53v15Ev,
  (VTBL_ENTRY)&_ZN6S679C43v16Ev,
  (VTBL_ENTRY)&_ZN6S679C43v17Ev,
  (VTBL_ENTRY)&_ZN6S679C43v18Ev,
  (VTBL_ENTRY)&_ZN6S679C43v19Ev,
  (VTBL_ENTRY)&_ZN6S679C43v20Ev,
  (VTBL_ENTRY)&_ZN6S679C43v21Ev,
  (VTBL_ENTRY)&_ZN6S679C43v22Ev,
  (VTBL_ENTRY)&_ZN6S679C43v23Ev,
  (VTBL_ENTRY)&_ZN6S679C43v24Ev,
  (VTBL_ENTRY)&_ZN6S679C43v25Ev,
  (VTBL_ENTRY)&_ZN6S679C43v26Ev,
  (VTBL_ENTRY)&_ZN6S679C43v27Ev,
  (VTBL_ENTRY)&_ZN6S679C43v28Ev,
  (VTBL_ENTRY)&_ZN6S679C43v29Ev,
  (VTBL_ENTRY)&_ZN6S679C33v30Ev,
  (VTBL_ENTRY)&_ZN6S679C33v31Ev,
  (VTBL_ENTRY)&_ZN6S679C33v32Ev,
  (VTBL_ENTRY)&_ZN6S679C33v33Ev,
  (VTBL_ENTRY)&_ZN6S679C23v34Ev,
  (VTBL_ENTRY)&_ZN6S679C23v35Ev,
  (VTBL_ENTRY)&_ZN6S679C23v36Ev,
  (VTBL_ENTRY)&_ZN6S679C23v37Ev,
  (VTBL_ENTRY)&_ZN6S679C12v1Ev,
  (VTBL_ENTRY)&_ZN6S679C12v2Ev,
  (VTBL_ENTRY)&_ZN6S679C12v3Ev,
  (VTBL_ENTRY)&_ZN6S679C12v4Ev,
  (VTBL_ENTRY)&_ZN6S679C12v5Ev,
};
extern VTBL_ENTRY _ZTI6S679C1[];
extern  VTBL_ENTRY _ZTV6S679C1[];
Class_Descriptor cd_S679C1 = {  "S679C1", // class name
  bases_S679C1, 4,
  &(vtc_S679C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1960,1500), // object size
  NSPAIRA(_ZTI6S679C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S679C1),41, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S680C5  {
  void *s680c5f0[2];
  ::S10103C13_nt s680c5f1;
  void *s680c5f2;
  virtual  ~S680C5(); // _ZN6S680C5D1Ev
  virtual void  v6(); // _ZN6S680C52v6Ev
  virtual void  v7(); // _ZN6S680C52v7Ev
  virtual void  v8(); // _ZN6S680C52v8Ev
  virtual void  v9(); // _ZN6S680C52v9Ev
  virtual void  v10(); // _ZN6S680C53v10Ev
  virtual void  v11(); // _ZN6S680C53v11Ev
  virtual void  v12(); // _ZN6S680C53v12Ev
  virtual void  v13(); // _ZN6S680C53v13Ev
  virtual void  v14(); // _ZN6S680C53v14Ev
  virtual void  v15(); // _ZN6S680C53v15Ev
  S680C5(); // tgen
};
//SIG(-1 S680C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S680C5 ::~S680C5(){ note_dtor("S680C5", this);}
void  S680C5 ::v6(){vfunc_called(this, "_ZN6S680C52v6Ev");}
void  S680C5 ::v7(){vfunc_called(this, "_ZN6S680C52v7Ev");}
void  S680C5 ::v8(){vfunc_called(this, "_ZN6S680C52v8Ev");}
void  S680C5 ::v9(){vfunc_called(this, "_ZN6S680C52v9Ev");}
void  S680C5 ::v10(){vfunc_called(this, "_ZN6S680C53v10Ev");}
void  S680C5 ::v11(){vfunc_called(this, "_ZN6S680C53v11Ev");}
void  S680C5 ::v12(){vfunc_called(this, "_ZN6S680C53v12Ev");}
void  S680C5 ::v13(){vfunc_called(this, "_ZN6S680C53v13Ev");}
void  S680C5 ::v14(){vfunc_called(this, "_ZN6S680C53v14Ev");}
void  S680C5 ::v15(){vfunc_called(this, "_ZN6S680C53v15Ev");}
S680C5 ::S680C5(){ note_ctor("S680C5", this);} // tgen

static void Test_S680C5()
{
  extern Class_Descriptor cd_S680C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S680C5, buf);
    S680C5 *dp, &lv = *(dp=new (buf) S680C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S680C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S680C5)");
    check_field_offset(lv, s680c5f0, ABISELECT(8,4), "S680C5.s680c5f0");
    check_field_offset(lv, s680c5f1, ABISELECT(24,12), "S680C5.s680c5f1");
    check_field_offset(lv, s680c5f2, ABISELECT(48,28), "S680C5.s680c5f2");
    test_class_info(&lv, &cd_S680C5);
    dp->~S680C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS680C5(Test_S680C5, "S680C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S680C5C1Ev();
extern void _ZN6S680C5D1Ev();
Name_Map name_map_S680C5[] = {
  NSPAIR(_ZN6S680C5C1Ev),
  NSPAIR(_ZN6S680C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S680C5[];
extern void _ZN6S680C5D1Ev();
extern void _ZN6S680C5D0Ev();
extern void _ZN6S680C52v6Ev();
extern void _ZN6S680C52v7Ev();
extern void _ZN6S680C52v8Ev();
extern void _ZN6S680C52v9Ev();
extern void _ZN6S680C53v10Ev();
extern void _ZN6S680C53v11Ev();
extern void _ZN6S680C53v12Ev();
extern void _ZN6S680C53v13Ev();
extern void _ZN6S680C53v14Ev();
extern void _ZN6S680C53v15Ev();
static  VTBL_ENTRY vtc_S680C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S680C5[0]),
  (VTBL_ENTRY)&_ZN6S680C5D1Ev,
  (VTBL_ENTRY)&_ZN6S680C5D0Ev,
  (VTBL_ENTRY)&_ZN6S680C52v6Ev,
  (VTBL_ENTRY)&_ZN6S680C52v7Ev,
  (VTBL_ENTRY)&_ZN6S680C52v8Ev,
  (VTBL_ENTRY)&_ZN6S680C52v9Ev,
  (VTBL_ENTRY)&_ZN6S680C53v10Ev,
  (VTBL_ENTRY)&_ZN6S680C53v11Ev,
  (VTBL_ENTRY)&_ZN6S680C53v12Ev,
  (VTBL_ENTRY)&_ZN6S680C53v13Ev,
  (VTBL_ENTRY)&_ZN6S680C53v14Ev,
  (VTBL_ENTRY)&_ZN6S680C53v15Ev,
};
extern VTBL_ENTRY _ZTI6S680C5[];
extern  VTBL_ENTRY _ZTV6S680C5[];
Class_Descriptor cd_S680C5 = {  "S680C5", // class name
  0,0,//no base classes
  &(vtc_S680C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S680C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S680C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S680C4  : S680C5 {
  ::S10103C86 s680c4f0;
  ::S10103C106 s680c4f1;
  ::S10103C82_nt s680c4f2;
  ::S10103C13_nt s680c4f3;
  virtual  ~S680C4(); // _ZN6S680C4D1Ev
  virtual void  v16(); // _ZN6S680C43v16Ev
  virtual void  v17(); // _ZN6S680C43v17Ev
  virtual void  v18(); // _ZN6S680C43v18Ev
  virtual void  v19(); // _ZN6S680C43v19Ev
  virtual void  v20(); // _ZN6S680C43v20Ev
  virtual void  v21(); // _ZN6S680C43v21Ev
  virtual void  v22(); // _ZN6S680C43v22Ev
  virtual void  v23(); // _ZN6S680C43v23Ev
  virtual void  v24(); // _ZN6S680C43v24Ev
  virtual void  v25(); // _ZN6S680C43v25Ev
  virtual void  v26(); // _ZN6S680C43v26Ev
  virtual void  v27(); // _ZN6S680C43v27Ev
  virtual void  v28(); // _ZN6S680C43v28Ev
  virtual void  v29(); // _ZN6S680C43v29Ev
  S680C4(); // tgen
};
//SIG(-1 S680C4) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S680C4 ::~S680C4(){ note_dtor("S680C4", this);}
void  S680C4 ::v16(){vfunc_called(this, "_ZN6S680C43v16Ev");}
void  S680C4 ::v17(){vfunc_called(this, "_ZN6S680C43v17Ev");}
void  S680C4 ::v18(){vfunc_called(this, "_ZN6S680C43v18Ev");}
void  S680C4 ::v19(){vfunc_called(this, "_ZN6S680C43v19Ev");}
void  S680C4 ::v20(){vfunc_called(this, "_ZN6S680C43v20Ev");}
void  S680C4 ::v21(){vfunc_called(this, "_ZN6S680C43v21Ev");}
void  S680C4 ::v22(){vfunc_called(this, "_ZN6S680C43v22Ev");}
void  S680C4 ::v23(){vfunc_called(this, "_ZN6S680C43v23Ev");}
void  S680C4 ::v24(){vfunc_called(this, "_ZN6S680C43v24Ev");}
void  S680C4 ::v25(){vfunc_called(this, "_ZN6S680C43v25Ev");}
void  S680C4 ::v26(){vfunc_called(this, "_ZN6S680C43v26Ev");}
void  S680C4 ::v27(){vfunc_called(this, "_ZN6S680C43v27Ev");}
void  S680C4 ::v28(){vfunc_called(this, "_ZN6S680C43v28Ev");}
void  S680C4 ::v29(){vfunc_called(this, "_ZN6S680C43v29Ev");}
S680C4 ::S680C4(){ note_ctor("S680C4", this);} // tgen

static void Test_S680C4()
{
  extern Class_Descriptor cd_S680C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S680C4, buf);
    S680C4 *dp, &lv = *(dp=new (buf) S680C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S680C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S680C4)");
    check_base_class_offset(lv, (S680C5*), 0, "S680C4");
    check_field_offset(lv, s680c4f0, ABISELECT(56,32), "S680C4.s680c4f0");
    check_field_offset(lv, s680c4f1, ABISELECT(72,44), "S680C4.s680c4f1");
    check_field_offset(lv, s680c4f2, ABISELECT(96,60), "S680C4.s680c4f2");
    check_field_offset(lv, s680c4f3, ABISELECT(112,76), "S680C4.s680c4f3");
    test_class_info(&lv, &cd_S680C4);
    dp->~S680C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS680C4(Test_S680C4, "S680C4", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN6S680C4C1Ev();
extern void _ZN6S680C4D1Ev();
Name_Map name_map_S680C4[] = {
  NSPAIR(_ZN6S680C4C1Ev),
  NSPAIR(_ZN6S680C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S680C5;
extern VTBL_ENTRY _ZTI6S680C5[];
extern  VTBL_ENTRY _ZTV6S680C5[];
static Base_Class bases_S680C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S680C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S680C4[];
extern void _ZN6S680C4D1Ev();
extern void _ZN6S680C4D0Ev();
extern void _ZN6S680C52v6Ev();
extern void _ZN6S680C52v7Ev();
extern void _ZN6S680C52v8Ev();
extern void _ZN6S680C52v9Ev();
extern void _ZN6S680C53v10Ev();
extern void _ZN6S680C53v11Ev();
extern void _ZN6S680C53v12Ev();
extern void _ZN6S680C53v13Ev();
extern void _ZN6S680C53v14Ev();
extern void _ZN6S680C53v15Ev();
extern void _ZN6S680C43v16Ev();
extern void _ZN6S680C43v17Ev();
extern void _ZN6S680C43v18Ev();
extern void _ZN6S680C43v19Ev();
extern void _ZN6S680C43v20Ev();
extern void _ZN6S680C43v21Ev();
extern void _ZN6S680C43v22Ev();
extern void _ZN6S680C43v23Ev();
extern void _ZN6S680C43v24Ev();
extern void _ZN6S680C43v25Ev();
extern void _ZN6S680C43v26Ev();
extern void _ZN6S680C43v27Ev();
extern void _ZN6S680C43v28Ev();
extern void _ZN6S680C43v29Ev();
static  VTBL_ENTRY vtc_S680C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S680C4[0]),
  (VTBL_ENTRY)&_ZN6S680C4D1Ev,
  (VTBL_ENTRY)&_ZN6S680C4D0Ev,
  (VTBL_ENTRY)&_ZN6S680C52v6Ev,
  (VTBL_ENTRY)&_ZN6S680C52v7Ev,
  (VTBL_ENTRY)&_ZN6S680C52v8Ev,
  (VTBL_ENTRY)&_ZN6S680C52v9Ev,
  (VTBL_ENTRY)&_ZN6S680C53v10Ev,
  (VTBL_ENTRY)&_ZN6S680C53v11Ev,
  (VTBL_ENTRY)&_ZN6S680C53v12Ev,
  (VTBL_ENTRY)&_ZN6S680C53v13Ev,
  (VTBL_ENTRY)&_ZN6S680C53v14Ev,
  (VTBL_ENTRY)&_ZN6S680C53v15Ev,
  (VTBL_ENTRY)&_ZN6S680C43v16Ev,
  (VTBL_ENTRY)&_ZN6S680C43v17Ev,
  (VTBL_ENTRY)&_ZN6S680C43v18Ev,
  (VTBL_ENTRY)&_ZN6S680C43v19Ev,
  (VTBL_ENTRY)&_ZN6S680C43v20Ev,
  (VTBL_ENTRY)&_ZN6S680C43v21Ev,
  (VTBL_ENTRY)&_ZN6S680C43v22Ev,
  (VTBL_ENTRY)&_ZN6S680C43v23Ev,
  (VTBL_ENTRY)&_ZN6S680C43v24Ev,
  (VTBL_ENTRY)&_ZN6S680C43v25Ev,
  (VTBL_ENTRY)&_ZN6S680C43v26Ev,
  (VTBL_ENTRY)&_ZN6S680C43v27Ev,
  (VTBL_ENTRY)&_ZN6S680C43v28Ev,
  (VTBL_ENTRY)&_ZN6S680C43v29Ev,
};
extern VTBL_ENTRY _ZTI6S680C4[];
extern  VTBL_ENTRY _ZTV6S680C4[];
Class_Descriptor cd_S680C4 = {  "S680C4", // class name
  bases_S680C4, 1,
  &(vtc_S680C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI6S680C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S680C4),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S680C3  : S680C4 {
  int s680c3f0;
  char s680c3f1[2];
  int s680c3f2;
  virtual void  v30(); // _ZN6S680C33v30Ev
  virtual void  v31(); // _ZN6S680C33v31Ev
  virtual void  v32(); // _ZN6S680C33v32Ev
  virtual void  v33(); // _ZN6S680C33v33Ev
  ~S680C3(); // tgen
  S680C3(); // tgen
};
//SIG(-1 S680C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 Fi Fc[2] Fi}


void  S680C3 ::v30(){vfunc_called(this, "_ZN6S680C33v30Ev");}
void  S680C3 ::v31(){vfunc_called(this, "_ZN6S680C33v31Ev");}
void  S680C3 ::v32(){vfunc_called(this, "_ZN6S680C33v32Ev");}
void  S680C3 ::v33(){vfunc_called(this, "_ZN6S680C33v33Ev");}
S680C3 ::~S680C3(){ note_dtor("S680C3", this);} // tgen
S680C3 ::S680C3(){ note_ctor("S680C3", this);} // tgen

static void Test_S680C3()
{
  extern Class_Descriptor cd_S680C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S680C3, buf);
    S680C3 *dp, &lv = *(dp=new (buf) S680C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S680C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S680C3)");
    check_base_class_offset(lv, (S680C5*)(S680C4*), 0, "S680C3");
    check_base_class_offset(lv, (S680C4*), 0, "S680C3");
    check_field_offset(lv, s680c3f0, ABISELECT(136,92), "S680C3.s680c3f0");
    check_field_offset(lv, s680c3f1, ABISELECT(140,96), "S680C3.s680c3f1");
    check_field_offset(lv, s680c3f2, ABISELECT(144,100), "S680C3.s680c3f2");
    test_class_info(&lv, &cd_S680C3);
    dp->~S680C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS680C3(Test_S680C3, "S680C3", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN6S680C3C1Ev();
extern void _ZN6S680C3D1Ev();
Name_Map name_map_S680C3[] = {
  NSPAIR(_ZN6S680C3C1Ev),
  NSPAIR(_ZN6S680C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S680C5;
extern VTBL_ENTRY _ZTI6S680C5[];
extern  VTBL_ENTRY _ZTV6S680C5[];
extern Class_Descriptor cd_S680C4;
extern VTBL_ENTRY _ZTI6S680C4[];
extern  VTBL_ENTRY _ZTV6S680C4[];
static Base_Class bases_S680C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S680C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S680C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S680C3[];
extern void _ZN6S680C3D1Ev();
extern void _ZN6S680C3D0Ev();
extern void _ZN6S680C52v6Ev();
extern void _ZN6S680C52v7Ev();
extern void _ZN6S680C52v8Ev();
extern void _ZN6S680C52v9Ev();
extern void _ZN6S680C53v10Ev();
extern void _ZN6S680C53v11Ev();
extern void _ZN6S680C53v12Ev();
extern void _ZN6S680C53v13Ev();
extern void _ZN6S680C53v14Ev();
extern void _ZN6S680C53v15Ev();
extern void _ZN6S680C43v16Ev();
extern void _ZN6S680C43v17Ev();
extern void _ZN6S680C43v18Ev();
extern void _ZN6S680C43v19Ev();
extern void _ZN6S680C43v20Ev();
extern void _ZN6S680C43v21Ev();
extern void _ZN6S680C43v22Ev();
extern void _ZN6S680C43v23Ev();
extern void _ZN6S680C43v24Ev();
extern void _ZN6S680C43v25Ev();
extern void _ZN6S680C43v26Ev();
extern void _ZN6S680C43v27Ev();
extern void _ZN6S680C43v28Ev();
extern void _ZN6S680C43v29Ev();
extern void _ZN6S680C33v30Ev();
extern void _ZN6S680C33v31Ev();
extern void _ZN6S680C33v32Ev();
extern void _ZN6S680C33v33Ev();
static  VTBL_ENTRY vtc_S680C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S680C3[0]),
  (VTBL_ENTRY)&_ZN6S680C3D1Ev,
  (VTBL_ENTRY)&_ZN6S680C3D0Ev,
  (VTBL_ENTRY)&_ZN6S680C52v6Ev,
  (VTBL_ENTRY)&_ZN6S680C52v7Ev,
  (VTBL_ENTRY)&_ZN6S680C52v8Ev,
  (VTBL_ENTRY)&_ZN6S680C52v9Ev,
  (VTBL_ENTRY)&_ZN6S680C53v10Ev,
  (VTBL_ENTRY)&_ZN6S680C53v11Ev,
  (VTBL_ENTRY)&_ZN6S680C53v12Ev,
  (VTBL_ENTRY)&_ZN6S680C53v13Ev,
  (VTBL_ENTRY)&_ZN6S680C53v14Ev,
  (VTBL_ENTRY)&_ZN6S680C53v15Ev,
  (VTBL_ENTRY)&_ZN6S680C43v16Ev,
  (VTBL_ENTRY)&_ZN6S680C43v17Ev,
  (VTBL_ENTRY)&_ZN6S680C43v18Ev,
  (VTBL_ENTRY)&_ZN6S680C43v19Ev,
  (VTBL_ENTRY)&_ZN6S680C43v20Ev,
  (VTBL_ENTRY)&_ZN6S680C43v21Ev,
  (VTBL_ENTRY)&_ZN6S680C43v22Ev,
  (VTBL_ENTRY)&_ZN6S680C43v23Ev,
  (VTBL_ENTRY)&_ZN6S680C43v24Ev,
  (VTBL_ENTRY)&_ZN6S680C43v25Ev,
  (VTBL_ENTRY)&_ZN6S680C43v26Ev,
  (VTBL_ENTRY)&_ZN6S680C43v27Ev,
  (VTBL_ENTRY)&_ZN6S680C43v28Ev,
  (VTBL_ENTRY)&_ZN6S680C43v29Ev,
  (VTBL_ENTRY)&_ZN6S680C33v30Ev,
  (VTBL_ENTRY)&_ZN6S680C33v31Ev,
  (VTBL_ENTRY)&_ZN6S680C33v32Ev,
  (VTBL_ENTRY)&_ZN6S680C33v33Ev,
};
extern VTBL_ENTRY _ZTI6S680C3[];
extern  VTBL_ENTRY _ZTV6S680C3[];
Class_Descriptor cd_S680C3 = {  "S680C3", // class name
  bases_S680C3, 2,
  &(vtc_S680C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI6S680C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S680C3),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S680C2  : S680C3 {
  ::S10103C84 s680c2f0;
  ::S679C23 s680c2f1;
  ::S10103C84 s680c2f2;
  ::S10103C84 s680c2f3;
  int s680c2f4;
  void *s680c2f5;
  int s680c2f6[2];
  virtual  ~S680C2(); // _ZN6S680C2D1Ev
  virtual void  v34(); // _ZN6S680C23v34Ev
  virtual void  v35(); // _ZN6S680C23v35Ev
  virtual void  v36(); // _ZN6S680C23v36Ev
  virtual void  v37(); // _ZN6S680C23v37Ev
  S680C2(); // tgen
};
//SIG(-1 S680C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 Fi Fc[2] Fi} vd v1 v2 v3 v4 FC14{ BC15{ BC16{ vd v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 Fp[2] FC5 Fp} vd v47 v48 v49 v50 v51 v52 Fp Fi FC8 FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC17{ BC18{ BC19{ vd v57 v58 v59 v60 v61 v62 v63 v64 v65 v66 Fp[2] FC5 Fp} vd v67 v68 v69 v70 v71 v72 Fp Fi FC20{ m Fp Fi FC21{ m} FC21} FC12 Fi} vd v53 v54 v55 v56 FC22{ m FC13} FC22 Fi[6] FC23{ m FC24{ m FL}} FC23 Fc[7] Fi[2] FC12 FC12 FC12 FC12 FC12 Fc[7]} FC14 FC14 Fi Fp Fi[2]}


 S680C2 ::~S680C2(){ note_dtor("S680C2", this);}
void  S680C2 ::v34(){vfunc_called(this, "_ZN6S680C23v34Ev");}
void  S680C2 ::v35(){vfunc_called(this, "_ZN6S680C23v35Ev");}
void  S680C2 ::v36(){vfunc_called(this, "_ZN6S680C23v36Ev");}
void  S680C2 ::v37(){vfunc_called(this, "_ZN6S680C23v37Ev");}
S680C2 ::S680C2(){ note_ctor("S680C2", this);} // tgen

static void Test_S680C2()
{
  extern Class_Descriptor cd_S680C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(170,261)];
    init_test(&cd_S680C2, buf);
    S680C2 *dp, &lv = *(dp=new (buf) S680C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1352,1040), "sizeof(S680C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S680C2)");
    check_base_class_offset(lv, (S680C5*)(S680C4*)(S680C3*), 0, "S680C2");
    check_base_class_offset(lv, (S680C4*)(S680C3*), 0, "S680C2");
    check_base_class_offset(lv, (S680C3*), 0, "S680C2");
    check_field_offset(lv, s680c2f0, ABISELECT(152,104), "S680C2.s680c2f0");
    check_field_offset(lv, s680c2f1, ABISELECT(448,328), "S680C2.s680c2f1");
    check_field_offset(lv, s680c2f2, ABISELECT(736,576), "S680C2.s680c2f2");
    check_field_offset(lv, s680c2f3, ABISELECT(1032,800), "S680C2.s680c2f3");
    check_field_offset(lv, s680c2f4, ABISELECT(1328,1024), "S680C2.s680c2f4");
    check_field_offset(lv, s680c2f5, ABISELECT(1336,1028), "S680C2.s680c2f5");
    check_field_offset(lv, s680c2f6, ABISELECT(1344,1032), "S680C2.s680c2f6");
    test_class_info(&lv, &cd_S680C2);
    dp->~S680C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS680C2(Test_S680C2, "S680C2", ABISELECT(1352,1040));

#else // __cplusplus

extern void _ZN6S680C2C1Ev();
extern void _ZN6S680C2D1Ev();
Name_Map name_map_S680C2[] = {
  NSPAIR(_ZN6S680C2C1Ev),
  NSPAIR(_ZN6S680C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S680C5;
extern VTBL_ENTRY _ZTI6S680C5[];
extern  VTBL_ENTRY _ZTV6S680C5[];
extern Class_Descriptor cd_S680C4;
extern VTBL_ENTRY _ZTI6S680C4[];
extern  VTBL_ENTRY _ZTV6S680C4[];
extern Class_Descriptor cd_S680C3;
extern VTBL_ENTRY _ZTI6S680C3[];
extern  VTBL_ENTRY _ZTV6S680C3[];
static Base_Class bases_S680C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S680C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S680C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S680C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S680C2[];
extern void _ZN6S680C2D1Ev();
extern void _ZN6S680C2D0Ev();
extern void _ZN6S680C52v6Ev();
extern void _ZN6S680C52v7Ev();
extern void _ZN6S680C52v8Ev();
extern void _ZN6S680C52v9Ev();
extern void _ZN6S680C53v10Ev();
extern void _ZN6S680C53v11Ev();
extern void _ZN6S680C53v12Ev();
extern void _ZN6S680C53v13Ev();
extern void _ZN6S680C53v14Ev();
extern void _ZN6S680C53v15Ev();
extern void _ZN6S680C43v16Ev();
extern void _ZN6S680C43v17Ev();
extern void _ZN6S680C43v18Ev();
extern void _ZN6S680C43v19Ev();
extern void _ZN6S680C43v20Ev();
extern void _ZN6S680C43v21Ev();
extern void _ZN6S680C43v22Ev();
extern void _ZN6S680C43v23Ev();
extern void _ZN6S680C43v24Ev();
extern void _ZN6S680C43v25Ev();
extern void _ZN6S680C43v26Ev();
extern void _ZN6S680C43v27Ev();
extern void _ZN6S680C43v28Ev();
extern void _ZN6S680C43v29Ev();
extern void _ZN6S680C33v30Ev();
extern void _ZN6S680C33v31Ev();
extern void _ZN6S680C33v32Ev();
extern void _ZN6S680C33v33Ev();
extern void _ZN6S680C23v34Ev();
extern void _ZN6S680C23v35Ev();
extern void _ZN6S680C23v36Ev();
extern void _ZN6S680C23v37Ev();
static  VTBL_ENTRY vtc_S680C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S680C2[0]),
  (VTBL_ENTRY)&_ZN6S680C2D1Ev,
  (VTBL_ENTRY)&_ZN6S680C2D0Ev,
  (VTBL_ENTRY)&_ZN6S680C52v6Ev,
  (VTBL_ENTRY)&_ZN6S680C52v7Ev,
  (VTBL_ENTRY)&_ZN6S680C52v8Ev,
  (VTBL_ENTRY)&_ZN6S680C52v9Ev,
  (VTBL_ENTRY)&_ZN6S680C53v10Ev,
  (VTBL_ENTRY)&_ZN6S680C53v11Ev,
  (VTBL_ENTRY)&_ZN6S680C53v12Ev,
  (VTBL_ENTRY)&_ZN6S680C53v13Ev,
  (VTBL_ENTRY)&_ZN6S680C53v14Ev,
  (VTBL_ENTRY)&_ZN6S680C53v15Ev,
  (VTBL_ENTRY)&_ZN6S680C43v16Ev,
  (VTBL_ENTRY)&_ZN6S680C43v17Ev,
  (VTBL_ENTRY)&_ZN6S680C43v18Ev,
  (VTBL_ENTRY)&_ZN6S680C43v19Ev,
  (VTBL_ENTRY)&_ZN6S680C43v20Ev,
  (VTBL_ENTRY)&_ZN6S680C43v21Ev,
  (VTBL_ENTRY)&_ZN6S680C43v22Ev,
  (VTBL_ENTRY)&_ZN6S680C43v23Ev,
  (VTBL_ENTRY)&_ZN6S680C43v24Ev,
  (VTBL_ENTRY)&_ZN6S680C43v25Ev,
  (VTBL_ENTRY)&_ZN6S680C43v26Ev,
  (VTBL_ENTRY)&_ZN6S680C43v27Ev,
  (VTBL_ENTRY)&_ZN6S680C43v28Ev,
  (VTBL_ENTRY)&_ZN6S680C43v29Ev,
  (VTBL_ENTRY)&_ZN6S680C33v30Ev,
  (VTBL_ENTRY)&_ZN6S680C33v31Ev,
  (VTBL_ENTRY)&_ZN6S680C33v32Ev,
  (VTBL_ENTRY)&_ZN6S680C33v33Ev,
  (VTBL_ENTRY)&_ZN6S680C23v34Ev,
  (VTBL_ENTRY)&_ZN6S680C23v35Ev,
  (VTBL_ENTRY)&_ZN6S680C23v36Ev,
  (VTBL_ENTRY)&_ZN6S680C23v37Ev,
};
extern VTBL_ENTRY _ZTI6S680C2[];
extern  VTBL_ENTRY _ZTV6S680C2[];
Class_Descriptor cd_S680C2 = {  "S680C2", // class name
  bases_S680C2, 3,
  &(vtc_S680C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1352,1040), // object size
  NSPAIRA(_ZTI6S680C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S680C2),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S680C1  : S680C2 {
  ::S10103C84 s680c1f0;
  int s680c1f1;
  virtual  ~S680C1(); // _ZN6S680C1D1Ev
  virtual void  v1(); // _ZN6S680C12v1Ev
  virtual void  v2(); // _ZN6S680C12v2Ev
  virtual void  v3(); // _ZN6S680C12v3Ev
  virtual void  v4(); // _ZN6S680C12v4Ev
  virtual void  v5(); // _ZN6S680C12v5Ev
  S680C1(); // tgen
};
//SIG(1 S680C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC12{ m Fp Fi[2] FC11} FC13{ m FC14{ m FL[2]}} FC6} v30 v31 v32 v33 Fi Fc[2] Fi} vd v34 v35 v36 v37 FC15{ BC16{ BC17{ vd v42 v43 v44 v45 v46 v47 v48 v49 v50 v51 Fp[2] FC6 Fp} vd v52 v53 v54 v55 v56 v57 Fp Fi FC9 FC13 Fi} vd v38 v39 v40 v41 FC6[4] FC13 FC13 FC13 FC13 Fi[6]} FC18{ BC19{ BC20{ vd v62 v63 v64 v65 v66 v67 v68 v69 v70 v71 Fp[2] FC6 Fp} vd v72 v73 v74 v75 v76 v77 Fp Fi FC21{ m Fp Fi FC22{ m} FC22} FC13 Fi} vd v58 v59 v60 v61 FC23{ m FC14} FC23 Fi[6] FC24{ m FC25{ m FL}} FC24 Fc[7] Fi[2] FC13 FC13 FC13 FC13 FC13 Fc[7]} FC15 FC15 Fi Fp Fi[2]} vd v1 v2 v3 v4 v5 FC15 Fi}


 S680C1 ::~S680C1(){ note_dtor("S680C1", this);}
void  S680C1 ::v1(){vfunc_called(this, "_ZN6S680C12v1Ev");}
void  S680C1 ::v2(){vfunc_called(this, "_ZN6S680C12v2Ev");}
void  S680C1 ::v3(){vfunc_called(this, "_ZN6S680C12v3Ev");}
void  S680C1 ::v4(){vfunc_called(this, "_ZN6S680C12v4Ev");}
void  S680C1 ::v5(){vfunc_called(this, "_ZN6S680C12v5Ev");}
S680C1 ::S680C1(){ note_ctor("S680C1", this);} // tgen

static void Test_S680C1()
{
  extern Class_Descriptor cd_S680C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(208,318)];
    init_test(&cd_S680C1, buf);
    S680C1 *dp, &lv = *(dp=new (buf) S680C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1656,1268), "sizeof(S680C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S680C1)");
    check_base_class_offset(lv, (S680C5*)(S680C4*)(S680C3*)(S680C2*), 0, "S680C1");
    check_base_class_offset(lv, (S680C4*)(S680C3*)(S680C2*), 0, "S680C1");
    check_base_class_offset(lv, (S680C3*)(S680C2*), 0, "S680C1");
    check_base_class_offset(lv, (S680C2*), 0, "S680C1");
    check_field_offset(lv, s680c1f0, ABISELECT(1352,1040), "S680C1.s680c1f0");
    check_field_offset(lv, s680c1f1, ABISELECT(1648,1264), "S680C1.s680c1f1");
    test_class_info(&lv, &cd_S680C1);
    dp->~S680C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS680C1(Test_S680C1, "S680C1", ABISELECT(1656,1268));

#else // __cplusplus

extern void _ZN6S680C1C1Ev();
extern void _ZN6S680C1D1Ev();
Name_Map name_map_S680C1[] = {
  NSPAIR(_ZN6S680C1C1Ev),
  NSPAIR(_ZN6S680C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S680C5;
extern VTBL_ENTRY _ZTI6S680C5[];
extern  VTBL_ENTRY _ZTV6S680C5[];
extern Class_Descriptor cd_S680C4;
extern VTBL_ENTRY _ZTI6S680C4[];
extern  VTBL_ENTRY _ZTV6S680C4[];
extern Class_Descriptor cd_S680C3;
extern VTBL_ENTRY _ZTI6S680C3[];
extern  VTBL_ENTRY _ZTV6S680C3[];
extern Class_Descriptor cd_S680C2;
extern VTBL_ENTRY _ZTI6S680C2[];
extern  VTBL_ENTRY _ZTV6S680C2[];
static Base_Class bases_S680C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S680C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S680C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S680C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S680C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S680C1[];
extern void _ZN6S680C1D1Ev();
extern void _ZN6S680C1D0Ev();
extern void _ZN6S680C52v6Ev();
extern void _ZN6S680C52v7Ev();
extern void _ZN6S680C52v8Ev();
extern void _ZN6S680C52v9Ev();
extern void _ZN6S680C53v10Ev();
extern void _ZN6S680C53v11Ev();
extern void _ZN6S680C53v12Ev();
extern void _ZN6S680C53v13Ev();
extern void _ZN6S680C53v14Ev();
extern void _ZN6S680C53v15Ev();
extern void _ZN6S680C43v16Ev();
extern void _ZN6S680C43v17Ev();
extern void _ZN6S680C43v18Ev();
extern void _ZN6S680C43v19Ev();
extern void _ZN6S680C43v20Ev();
extern void _ZN6S680C43v21Ev();
extern void _ZN6S680C43v22Ev();
extern void _ZN6S680C43v23Ev();
extern void _ZN6S680C43v24Ev();
extern void _ZN6S680C43v25Ev();
extern void _ZN6S680C43v26Ev();
extern void _ZN6S680C43v27Ev();
extern void _ZN6S680C43v28Ev();
extern void _ZN6S680C43v29Ev();
extern void _ZN6S680C33v30Ev();
extern void _ZN6S680C33v31Ev();
extern void _ZN6S680C33v32Ev();
extern void _ZN6S680C33v33Ev();
extern void _ZN6S680C23v34Ev();
extern void _ZN6S680C23v35Ev();
extern void _ZN6S680C23v36Ev();
extern void _ZN6S680C23v37Ev();
extern void _ZN6S680C12v1Ev();
extern void _ZN6S680C12v2Ev();
extern void _ZN6S680C12v3Ev();
extern void _ZN6S680C12v4Ev();
extern void _ZN6S680C12v5Ev();
static  VTBL_ENTRY vtc_S680C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S680C1[0]),
  (VTBL_ENTRY)&_ZN6S680C1D1Ev,
  (VTBL_ENTRY)&_ZN6S680C1D0Ev,
  (VTBL_ENTRY)&_ZN6S680C52v6Ev,
  (VTBL_ENTRY)&_ZN6S680C52v7Ev,
  (VTBL_ENTRY)&_ZN6S680C52v8Ev,
  (VTBL_ENTRY)&_ZN6S680C52v9Ev,
  (VTBL_ENTRY)&_ZN6S680C53v10Ev,
  (VTBL_ENTRY)&_ZN6S680C53v11Ev,
  (VTBL_ENTRY)&_ZN6S680C53v12Ev,
  (VTBL_ENTRY)&_ZN6S680C53v13Ev,
  (VTBL_ENTRY)&_ZN6S680C53v14Ev,
  (VTBL_ENTRY)&_ZN6S680C53v15Ev,
  (VTBL_ENTRY)&_ZN6S680C43v16Ev,
  (VTBL_ENTRY)&_ZN6S680C43v17Ev,
  (VTBL_ENTRY)&_ZN6S680C43v18Ev,
  (VTBL_ENTRY)&_ZN6S680C43v19Ev,
  (VTBL_ENTRY)&_ZN6S680C43v20Ev,
  (VTBL_ENTRY)&_ZN6S680C43v21Ev,
  (VTBL_ENTRY)&_ZN6S680C43v22Ev,
  (VTBL_ENTRY)&_ZN6S680C43v23Ev,
  (VTBL_ENTRY)&_ZN6S680C43v24Ev,
  (VTBL_ENTRY)&_ZN6S680C43v25Ev,
  (VTBL_ENTRY)&_ZN6S680C43v26Ev,
  (VTBL_ENTRY)&_ZN6S680C43v27Ev,
  (VTBL_ENTRY)&_ZN6S680C43v28Ev,
  (VTBL_ENTRY)&_ZN6S680C43v29Ev,
  (VTBL_ENTRY)&_ZN6S680C33v30Ev,
  (VTBL_ENTRY)&_ZN6S680C33v31Ev,
  (VTBL_ENTRY)&_ZN6S680C33v32Ev,
  (VTBL_ENTRY)&_ZN6S680C33v33Ev,
  (VTBL_ENTRY)&_ZN6S680C23v34Ev,
  (VTBL_ENTRY)&_ZN6S680C23v35Ev,
  (VTBL_ENTRY)&_ZN6S680C23v36Ev,
  (VTBL_ENTRY)&_ZN6S680C23v37Ev,
  (VTBL_ENTRY)&_ZN6S680C12v1Ev,
  (VTBL_ENTRY)&_ZN6S680C12v2Ev,
  (VTBL_ENTRY)&_ZN6S680C12v3Ev,
  (VTBL_ENTRY)&_ZN6S680C12v4Ev,
  (VTBL_ENTRY)&_ZN6S680C12v5Ev,
};
extern VTBL_ENTRY _ZTI6S680C1[];
extern  VTBL_ENTRY _ZTV6S680C1[];
Class_Descriptor cd_S680C1 = {  "S680C1", // class name
  bases_S680C1, 4,
  &(vtc_S680C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1656,1268), // object size
  NSPAIRA(_ZTI6S680C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S680C1),41, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S597C5  {
  void *s597c5f0[2];
  ::S10103C13_nt s597c5f1;
  void *s597c5f2;
  virtual  ~S597C5(); // _ZN6S597C5D1Ev
  virtual void  v4(); // _ZN6S597C52v4Ev
  virtual void  v5(); // _ZN6S597C52v5Ev
  virtual void  v6(); // _ZN6S597C52v6Ev
  virtual void  v7(); // _ZN6S597C52v7Ev
  virtual void  v8(); // _ZN6S597C52v8Ev
  virtual void  v9(); // _ZN6S597C52v9Ev
  virtual void  v10(); // _ZN6S597C53v10Ev
  virtual void  v11(); // _ZN6S597C53v11Ev
  virtual void  v12(); // _ZN6S597C53v12Ev
  virtual void  v13(); // _ZN6S597C53v13Ev
  S597C5(); // tgen
};
//SIG(-1 S597C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S597C5 ::~S597C5(){ note_dtor("S597C5", this);}
void  S597C5 ::v4(){vfunc_called(this, "_ZN6S597C52v4Ev");}
void  S597C5 ::v5(){vfunc_called(this, "_ZN6S597C52v5Ev");}
void  S597C5 ::v6(){vfunc_called(this, "_ZN6S597C52v6Ev");}
void  S597C5 ::v7(){vfunc_called(this, "_ZN6S597C52v7Ev");}
void  S597C5 ::v8(){vfunc_called(this, "_ZN6S597C52v8Ev");}
void  S597C5 ::v9(){vfunc_called(this, "_ZN6S597C52v9Ev");}
void  S597C5 ::v10(){vfunc_called(this, "_ZN6S597C53v10Ev");}
void  S597C5 ::v11(){vfunc_called(this, "_ZN6S597C53v11Ev");}
void  S597C5 ::v12(){vfunc_called(this, "_ZN6S597C53v12Ev");}
void  S597C5 ::v13(){vfunc_called(this, "_ZN6S597C53v13Ev");}
S597C5 ::S597C5(){ note_ctor("S597C5", this);} // tgen

static void Test_S597C5()
{
  extern Class_Descriptor cd_S597C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S597C5, buf);
    S597C5 *dp, &lv = *(dp=new (buf) S597C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S597C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S597C5)");
    check_field_offset(lv, s597c5f0, ABISELECT(8,4), "S597C5.s597c5f0");
    check_field_offset(lv, s597c5f1, ABISELECT(24,12), "S597C5.s597c5f1");
    check_field_offset(lv, s597c5f2, ABISELECT(48,28), "S597C5.s597c5f2");
    test_class_info(&lv, &cd_S597C5);
    dp->~S597C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS597C5(Test_S597C5, "S597C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S597C5C1Ev();
extern void _ZN6S597C5D1Ev();
Name_Map name_map_S597C5[] = {
  NSPAIR(_ZN6S597C5C1Ev),
  NSPAIR(_ZN6S597C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S597C5[];
extern void _ZN6S597C5D1Ev();
extern void _ZN6S597C5D0Ev();
extern void _ZN6S597C52v4Ev();
extern void _ZN6S597C52v5Ev();
extern void _ZN6S597C52v6Ev();
extern void _ZN6S597C52v7Ev();
extern void _ZN6S597C52v8Ev();
extern void _ZN6S597C52v9Ev();
extern void _ZN6S597C53v10Ev();
extern void _ZN6S597C53v11Ev();
extern void _ZN6S597C53v12Ev();
extern void _ZN6S597C53v13Ev();
static  VTBL_ENTRY vtc_S597C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S597C5[0]),
  (VTBL_ENTRY)&_ZN6S597C5D1Ev,
  (VTBL_ENTRY)&_ZN6S597C5D0Ev,
  (VTBL_ENTRY)&_ZN6S597C52v4Ev,
  (VTBL_ENTRY)&_ZN6S597C52v5Ev,
  (VTBL_ENTRY)&_ZN6S597C52v6Ev,
  (VTBL_ENTRY)&_ZN6S597C52v7Ev,
  (VTBL_ENTRY)&_ZN6S597C52v8Ev,
  (VTBL_ENTRY)&_ZN6S597C52v9Ev,
  (VTBL_ENTRY)&_ZN6S597C53v10Ev,
  (VTBL_ENTRY)&_ZN6S597C53v11Ev,
  (VTBL_ENTRY)&_ZN6S597C53v12Ev,
  (VTBL_ENTRY)&_ZN6S597C53v13Ev,
};
extern VTBL_ENTRY _ZTI6S597C5[];
extern  VTBL_ENTRY _ZTV6S597C5[];
Class_Descriptor cd_S597C5 = {  "S597C5", // class name
  0,0,//no base classes
  &(vtc_S597C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S597C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S597C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S597C4  : S597C5 {
  ::S10103C86 s597c4f0;
  ::S10103C106 s597c4f1;
  ::S10103C82_nt s597c4f2;
  ::S10103C13_nt s597c4f3;
  virtual  ~S597C4(); // _ZN6S597C4D1Ev
  virtual void  v14(); // _ZN6S597C43v14Ev
  virtual void  v15(); // _ZN6S597C43v15Ev
  virtual void  v16(); // _ZN6S597C43v16Ev
  virtual void  v17(); // _ZN6S597C43v17Ev
  virtual void  v18(); // _ZN6S597C43v18Ev
  virtual void  v19(); // _ZN6S597C43v19Ev
  virtual void  v20(); // _ZN6S597C43v20Ev
  virtual void  v21(); // _ZN6S597C43v21Ev
  virtual void  v22(); // _ZN6S597C43v22Ev
  virtual void  v23(); // _ZN6S597C43v23Ev
  virtual void  v24(); // _ZN6S597C43v24Ev
  virtual void  v25(); // _ZN6S597C43v25Ev
  virtual void  v26(); // _ZN6S597C43v26Ev
  virtual void  v27(); // _ZN6S597C43v27Ev
  S597C4(); // tgen
};
//SIG(-1 S597C4) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S597C4 ::~S597C4(){ note_dtor("S597C4", this);}
void  S597C4 ::v14(){vfunc_called(this, "_ZN6S597C43v14Ev");}
void  S597C4 ::v15(){vfunc_called(this, "_ZN6S597C43v15Ev");}
void  S597C4 ::v16(){vfunc_called(this, "_ZN6S597C43v16Ev");}
void  S597C4 ::v17(){vfunc_called(this, "_ZN6S597C43v17Ev");}
void  S597C4 ::v18(){vfunc_called(this, "_ZN6S597C43v18Ev");}
void  S597C4 ::v19(){vfunc_called(this, "_ZN6S597C43v19Ev");}
void  S597C4 ::v20(){vfunc_called(this, "_ZN6S597C43v20Ev");}
void  S597C4 ::v21(){vfunc_called(this, "_ZN6S597C43v21Ev");}
void  S597C4 ::v22(){vfunc_called(this, "_ZN6S597C43v22Ev");}
void  S597C4 ::v23(){vfunc_called(this, "_ZN6S597C43v23Ev");}
void  S597C4 ::v24(){vfunc_called(this, "_ZN6S597C43v24Ev");}
void  S597C4 ::v25(){vfunc_called(this, "_ZN6S597C43v25Ev");}
void  S597C4 ::v26(){vfunc_called(this, "_ZN6S597C43v26Ev");}
void  S597C4 ::v27(){vfunc_called(this, "_ZN6S597C43v27Ev");}
S597C4 ::S597C4(){ note_ctor("S597C4", this);} // tgen

static void Test_S597C4()
{
  extern Class_Descriptor cd_S597C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S597C4, buf);
    S597C4 *dp, &lv = *(dp=new (buf) S597C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S597C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S597C4)");
    check_base_class_offset(lv, (S597C5*), 0, "S597C4");
    check_field_offset(lv, s597c4f0, ABISELECT(56,32), "S597C4.s597c4f0");
    check_field_offset(lv, s597c4f1, ABISELECT(72,44), "S597C4.s597c4f1");
    check_field_offset(lv, s597c4f2, ABISELECT(96,60), "S597C4.s597c4f2");
    check_field_offset(lv, s597c4f3, ABISELECT(112,76), "S597C4.s597c4f3");
    test_class_info(&lv, &cd_S597C4);
    dp->~S597C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS597C4(Test_S597C4, "S597C4", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN6S597C4C1Ev();
extern void _ZN6S597C4D1Ev();
Name_Map name_map_S597C4[] = {
  NSPAIR(_ZN6S597C4C1Ev),
  NSPAIR(_ZN6S597C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S597C5;
extern VTBL_ENTRY _ZTI6S597C5[];
extern  VTBL_ENTRY _ZTV6S597C5[];
static Base_Class bases_S597C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S597C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S597C4[];
extern void _ZN6S597C4D1Ev();
extern void _ZN6S597C4D0Ev();
extern void _ZN6S597C52v4Ev();
extern void _ZN6S597C52v5Ev();
extern void _ZN6S597C52v6Ev();
extern void _ZN6S597C52v7Ev();
extern void _ZN6S597C52v8Ev();
extern void _ZN6S597C52v9Ev();
extern void _ZN6S597C53v10Ev();
extern void _ZN6S597C53v11Ev();
extern void _ZN6S597C53v12Ev();
extern void _ZN6S597C53v13Ev();
extern void _ZN6S597C43v14Ev();
extern void _ZN6S597C43v15Ev();
extern void _ZN6S597C43v16Ev();
extern void _ZN6S597C43v17Ev();
extern void _ZN6S597C43v18Ev();
extern void _ZN6S597C43v19Ev();
extern void _ZN6S597C43v20Ev();
extern void _ZN6S597C43v21Ev();
extern void _ZN6S597C43v22Ev();
extern void _ZN6S597C43v23Ev();
extern void _ZN6S597C43v24Ev();
extern void _ZN6S597C43v25Ev();
extern void _ZN6S597C43v26Ev();
extern void _ZN6S597C43v27Ev();
static  VTBL_ENTRY vtc_S597C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S597C4[0]),
  (VTBL_ENTRY)&_ZN6S597C4D1Ev,
  (VTBL_ENTRY)&_ZN6S597C4D0Ev,
  (VTBL_ENTRY)&_ZN6S597C52v4Ev,
  (VTBL_ENTRY)&_ZN6S597C52v5Ev,
  (VTBL_ENTRY)&_ZN6S597C52v6Ev,
  (VTBL_ENTRY)&_ZN6S597C52v7Ev,
  (VTBL_ENTRY)&_ZN6S597C52v8Ev,
  (VTBL_ENTRY)&_ZN6S597C52v9Ev,
  (VTBL_ENTRY)&_ZN6S597C53v10Ev,
  (VTBL_ENTRY)&_ZN6S597C53v11Ev,
  (VTBL_ENTRY)&_ZN6S597C53v12Ev,
  (VTBL_ENTRY)&_ZN6S597C53v13Ev,
  (VTBL_ENTRY)&_ZN6S597C43v14Ev,
  (VTBL_ENTRY)&_ZN6S597C43v15Ev,
  (VTBL_ENTRY)&_ZN6S597C43v16Ev,
  (VTBL_ENTRY)&_ZN6S597C43v17Ev,
  (VTBL_ENTRY)&_ZN6S597C43v18Ev,
  (VTBL_ENTRY)&_ZN6S597C43v19Ev,
  (VTBL_ENTRY)&_ZN6S597C43v20Ev,
  (VTBL_ENTRY)&_ZN6S597C43v21Ev,
  (VTBL_ENTRY)&_ZN6S597C43v22Ev,
  (VTBL_ENTRY)&_ZN6S597C43v23Ev,
  (VTBL_ENTRY)&_ZN6S597C43v24Ev,
  (VTBL_ENTRY)&_ZN6S597C43v25Ev,
  (VTBL_ENTRY)&_ZN6S597C43v26Ev,
  (VTBL_ENTRY)&_ZN6S597C43v27Ev,
};
extern VTBL_ENTRY _ZTI6S597C4[];
extern  VTBL_ENTRY _ZTV6S597C4[];
Class_Descriptor cd_S597C4 = {  "S597C4", // class name
  bases_S597C4, 1,
  &(vtc_S597C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI6S597C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S597C4),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S597C3  : S597C4 {
  int s597c3f0;
  char s597c3f1[2];
  int s597c3f2;
  virtual void  v28(); // _ZN6S597C33v28Ev
  virtual void  v29(); // _ZN6S597C33v29Ev
  virtual void  v30(); // _ZN6S597C33v30Ev
  virtual void  v31(); // _ZN6S597C33v31Ev
  ~S597C3(); // tgen
  S597C3(); // tgen
};
//SIG(-1 S597C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 Fi Fc[2] Fi}


void  S597C3 ::v28(){vfunc_called(this, "_ZN6S597C33v28Ev");}
void  S597C3 ::v29(){vfunc_called(this, "_ZN6S597C33v29Ev");}
void  S597C3 ::v30(){vfunc_called(this, "_ZN6S597C33v30Ev");}
void  S597C3 ::v31(){vfunc_called(this, "_ZN6S597C33v31Ev");}
S597C3 ::~S597C3(){ note_dtor("S597C3", this);} // tgen
S597C3 ::S597C3(){ note_ctor("S597C3", this);} // tgen

static void Test_S597C3()
{
  extern Class_Descriptor cd_S597C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S597C3, buf);
    S597C3 *dp, &lv = *(dp=new (buf) S597C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S597C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S597C3)");
    check_base_class_offset(lv, (S597C5*)(S597C4*), 0, "S597C3");
    check_base_class_offset(lv, (S597C4*), 0, "S597C3");
    check_field_offset(lv, s597c3f0, ABISELECT(136,92), "S597C3.s597c3f0");
    check_field_offset(lv, s597c3f1, ABISELECT(140,96), "S597C3.s597c3f1");
    check_field_offset(lv, s597c3f2, ABISELECT(144,100), "S597C3.s597c3f2");
    test_class_info(&lv, &cd_S597C3);
    dp->~S597C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS597C3(Test_S597C3, "S597C3", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN6S597C3C1Ev();
extern void _ZN6S597C3D1Ev();
Name_Map name_map_S597C3[] = {
  NSPAIR(_ZN6S597C3C1Ev),
  NSPAIR(_ZN6S597C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S597C5;
extern VTBL_ENTRY _ZTI6S597C5[];
extern  VTBL_ENTRY _ZTV6S597C5[];
extern Class_Descriptor cd_S597C4;
extern VTBL_ENTRY _ZTI6S597C4[];
extern  VTBL_ENTRY _ZTV6S597C4[];
static Base_Class bases_S597C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S597C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S597C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S597C3[];
extern void _ZN6S597C3D1Ev();
extern void _ZN6S597C3D0Ev();
extern void _ZN6S597C52v4Ev();
extern void _ZN6S597C52v5Ev();
extern void _ZN6S597C52v6Ev();
extern void _ZN6S597C52v7Ev();
extern void _ZN6S597C52v8Ev();
extern void _ZN6S597C52v9Ev();
extern void _ZN6S597C53v10Ev();
extern void _ZN6S597C53v11Ev();
extern void _ZN6S597C53v12Ev();
extern void _ZN6S597C53v13Ev();
extern void _ZN6S597C43v14Ev();
extern void _ZN6S597C43v15Ev();
extern void _ZN6S597C43v16Ev();
extern void _ZN6S597C43v17Ev();
extern void _ZN6S597C43v18Ev();
extern void _ZN6S597C43v19Ev();
extern void _ZN6S597C43v20Ev();
extern void _ZN6S597C43v21Ev();
extern void _ZN6S597C43v22Ev();
extern void _ZN6S597C43v23Ev();
extern void _ZN6S597C43v24Ev();
extern void _ZN6S597C43v25Ev();
extern void _ZN6S597C43v26Ev();
extern void _ZN6S597C43v27Ev();
extern void _ZN6S597C33v28Ev();
extern void _ZN6S597C33v29Ev();
extern void _ZN6S597C33v30Ev();
extern void _ZN6S597C33v31Ev();
static  VTBL_ENTRY vtc_S597C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S597C3[0]),
  (VTBL_ENTRY)&_ZN6S597C3D1Ev,
  (VTBL_ENTRY)&_ZN6S597C3D0Ev,
  (VTBL_ENTRY)&_ZN6S597C52v4Ev,
  (VTBL_ENTRY)&_ZN6S597C52v5Ev,
  (VTBL_ENTRY)&_ZN6S597C52v6Ev,
  (VTBL_ENTRY)&_ZN6S597C52v7Ev,
  (VTBL_ENTRY)&_ZN6S597C52v8Ev,
  (VTBL_ENTRY)&_ZN6S597C52v9Ev,
  (VTBL_ENTRY)&_ZN6S597C53v10Ev,
  (VTBL_ENTRY)&_ZN6S597C53v11Ev,
  (VTBL_ENTRY)&_ZN6S597C53v12Ev,
  (VTBL_ENTRY)&_ZN6S597C53v13Ev,
  (VTBL_ENTRY)&_ZN6S597C43v14Ev,
  (VTBL_ENTRY)&_ZN6S597C43v15Ev,
  (VTBL_ENTRY)&_ZN6S597C43v16Ev,
  (VTBL_ENTRY)&_ZN6S597C43v17Ev,
  (VTBL_ENTRY)&_ZN6S597C43v18Ev,
  (VTBL_ENTRY)&_ZN6S597C43v19Ev,
  (VTBL_ENTRY)&_ZN6S597C43v20Ev,
  (VTBL_ENTRY)&_ZN6S597C43v21Ev,
  (VTBL_ENTRY)&_ZN6S597C43v22Ev,
  (VTBL_ENTRY)&_ZN6S597C43v23Ev,
  (VTBL_ENTRY)&_ZN6S597C43v24Ev,
  (VTBL_ENTRY)&_ZN6S597C43v25Ev,
  (VTBL_ENTRY)&_ZN6S597C43v26Ev,
  (VTBL_ENTRY)&_ZN6S597C43v27Ev,
  (VTBL_ENTRY)&_ZN6S597C33v28Ev,
  (VTBL_ENTRY)&_ZN6S597C33v29Ev,
  (VTBL_ENTRY)&_ZN6S597C33v30Ev,
  (VTBL_ENTRY)&_ZN6S597C33v31Ev,
};
extern VTBL_ENTRY _ZTI6S597C3[];
extern  VTBL_ENTRY _ZTV6S597C3[];
Class_Descriptor cd_S597C3 = {  "S597C3", // class name
  bases_S597C3, 2,
  &(vtc_S597C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI6S597C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S597C3),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S597C2  : S597C3 {
  ::S10103C84 s597c2f0;
  ::S679C23 s597c2f1;
  ::S10103C84 s597c2f2;
  ::S10103C84 s597c2f3;
  int s597c2f4;
  void *s597c2f5;
  int s597c2f6[2];
  virtual  ~S597C2(); // _ZN6S597C2D1Ev
  virtual void  v32(); // _ZN6S597C23v32Ev
  virtual void  v33(); // _ZN6S597C23v33Ev
  virtual void  v34(); // _ZN6S597C23v34Ev
  virtual void  v35(); // _ZN6S597C23v35Ev
  S597C2(); // tgen
};
//SIG(-1 S597C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 Fi Fc[2] Fi} vd v1 v2 v3 v4 FC14{ BC15{ BC16{ vd v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 Fp[2] FC5 Fp} vd v47 v48 v49 v50 v51 v52 Fp Fi FC8 FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC17{ BC18{ BC19{ vd v57 v58 v59 v60 v61 v62 v63 v64 v65 v66 Fp[2] FC5 Fp} vd v67 v68 v69 v70 v71 v72 Fp Fi FC20{ m Fp Fi FC21{ m} FC21} FC12 Fi} vd v53 v54 v55 v56 FC22{ m FC13} FC22 Fi[6] FC23{ m FC24{ m FL}} FC23 Fc[7] Fi[2] FC12 FC12 FC12 FC12 FC12 Fc[7]} FC14 FC14 Fi Fp Fi[2]}


 S597C2 ::~S597C2(){ note_dtor("S597C2", this);}
void  S597C2 ::v32(){vfunc_called(this, "_ZN6S597C23v32Ev");}
void  S597C2 ::v33(){vfunc_called(this, "_ZN6S597C23v33Ev");}
void  S597C2 ::v34(){vfunc_called(this, "_ZN6S597C23v34Ev");}
void  S597C2 ::v35(){vfunc_called(this, "_ZN6S597C23v35Ev");}
S597C2 ::S597C2(){ note_ctor("S597C2", this);} // tgen

static void Test_S597C2()
{
  extern Class_Descriptor cd_S597C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(170,261)];
    init_test(&cd_S597C2, buf);
    S597C2 *dp, &lv = *(dp=new (buf) S597C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1352,1040), "sizeof(S597C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S597C2)");
    check_base_class_offset(lv, (S597C5*)(S597C4*)(S597C3*), 0, "S597C2");
    check_base_class_offset(lv, (S597C4*)(S597C3*), 0, "S597C2");
    check_base_class_offset(lv, (S597C3*), 0, "S597C2");
    check_field_offset(lv, s597c2f0, ABISELECT(152,104), "S597C2.s597c2f0");
    check_field_offset(lv, s597c2f1, ABISELECT(448,328), "S597C2.s597c2f1");
    check_field_offset(lv, s597c2f2, ABISELECT(736,576), "S597C2.s597c2f2");
    check_field_offset(lv, s597c2f3, ABISELECT(1032,800), "S597C2.s597c2f3");
    check_field_offset(lv, s597c2f4, ABISELECT(1328,1024), "S597C2.s597c2f4");
    check_field_offset(lv, s597c2f5, ABISELECT(1336,1028), "S597C2.s597c2f5");
    check_field_offset(lv, s597c2f6, ABISELECT(1344,1032), "S597C2.s597c2f6");
    test_class_info(&lv, &cd_S597C2);
    dp->~S597C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS597C2(Test_S597C2, "S597C2", ABISELECT(1352,1040));

#else // __cplusplus

extern void _ZN6S597C2C1Ev();
extern void _ZN6S597C2D1Ev();
Name_Map name_map_S597C2[] = {
  NSPAIR(_ZN6S597C2C1Ev),
  NSPAIR(_ZN6S597C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S597C5;
extern VTBL_ENTRY _ZTI6S597C5[];
extern  VTBL_ENTRY _ZTV6S597C5[];
extern Class_Descriptor cd_S597C4;
extern VTBL_ENTRY _ZTI6S597C4[];
extern  VTBL_ENTRY _ZTV6S597C4[];
extern Class_Descriptor cd_S597C3;
extern VTBL_ENTRY _ZTI6S597C3[];
extern  VTBL_ENTRY _ZTV6S597C3[];
static Base_Class bases_S597C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S597C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S597C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S597C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S597C2[];
extern void _ZN6S597C2D1Ev();
extern void _ZN6S597C2D0Ev();
extern void _ZN6S597C52v4Ev();
extern void _ZN6S597C52v5Ev();
extern void _ZN6S597C52v6Ev();
extern void _ZN6S597C52v7Ev();
extern void _ZN6S597C52v8Ev();
extern void _ZN6S597C52v9Ev();
extern void _ZN6S597C53v10Ev();
extern void _ZN6S597C53v11Ev();
extern void _ZN6S597C53v12Ev();
extern void _ZN6S597C53v13Ev();
extern void _ZN6S597C43v14Ev();
extern void _ZN6S597C43v15Ev();
extern void _ZN6S597C43v16Ev();
extern void _ZN6S597C43v17Ev();
extern void _ZN6S597C43v18Ev();
extern void _ZN6S597C43v19Ev();
extern void _ZN6S597C43v20Ev();
extern void _ZN6S597C43v21Ev();
extern void _ZN6S597C43v22Ev();
extern void _ZN6S597C43v23Ev();
extern void _ZN6S597C43v24Ev();
extern void _ZN6S597C43v25Ev();
extern void _ZN6S597C43v26Ev();
extern void _ZN6S597C43v27Ev();
extern void _ZN6S597C33v28Ev();
extern void _ZN6S597C33v29Ev();
extern void _ZN6S597C33v30Ev();
extern void _ZN6S597C33v31Ev();
extern void _ZN6S597C23v32Ev();
extern void _ZN6S597C23v33Ev();
extern void _ZN6S597C23v34Ev();
extern void _ZN6S597C23v35Ev();
static  VTBL_ENTRY vtc_S597C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S597C2[0]),
  (VTBL_ENTRY)&_ZN6S597C2D1Ev,
  (VTBL_ENTRY)&_ZN6S597C2D0Ev,
  (VTBL_ENTRY)&_ZN6S597C52v4Ev,
  (VTBL_ENTRY)&_ZN6S597C52v5Ev,
  (VTBL_ENTRY)&_ZN6S597C52v6Ev,
  (VTBL_ENTRY)&_ZN6S597C52v7Ev,
  (VTBL_ENTRY)&_ZN6S597C52v8Ev,
  (VTBL_ENTRY)&_ZN6S597C52v9Ev,
  (VTBL_ENTRY)&_ZN6S597C53v10Ev,
  (VTBL_ENTRY)&_ZN6S597C53v11Ev,
  (VTBL_ENTRY)&_ZN6S597C53v12Ev,
  (VTBL_ENTRY)&_ZN6S597C53v13Ev,
  (VTBL_ENTRY)&_ZN6S597C43v14Ev,
  (VTBL_ENTRY)&_ZN6S597C43v15Ev,
  (VTBL_ENTRY)&_ZN6S597C43v16Ev,
  (VTBL_ENTRY)&_ZN6S597C43v17Ev,
  (VTBL_ENTRY)&_ZN6S597C43v18Ev,
  (VTBL_ENTRY)&_ZN6S597C43v19Ev,
  (VTBL_ENTRY)&_ZN6S597C43v20Ev,
  (VTBL_ENTRY)&_ZN6S597C43v21Ev,
  (VTBL_ENTRY)&_ZN6S597C43v22Ev,
  (VTBL_ENTRY)&_ZN6S597C43v23Ev,
  (VTBL_ENTRY)&_ZN6S597C43v24Ev,
  (VTBL_ENTRY)&_ZN6S597C43v25Ev,
  (VTBL_ENTRY)&_ZN6S597C43v26Ev,
  (VTBL_ENTRY)&_ZN6S597C43v27Ev,
  (VTBL_ENTRY)&_ZN6S597C33v28Ev,
  (VTBL_ENTRY)&_ZN6S597C33v29Ev,
  (VTBL_ENTRY)&_ZN6S597C33v30Ev,
  (VTBL_ENTRY)&_ZN6S597C33v31Ev,
  (VTBL_ENTRY)&_ZN6S597C23v32Ev,
  (VTBL_ENTRY)&_ZN6S597C23v33Ev,
  (VTBL_ENTRY)&_ZN6S597C23v34Ev,
  (VTBL_ENTRY)&_ZN6S597C23v35Ev,
};
extern VTBL_ENTRY _ZTI6S597C2[];
extern  VTBL_ENTRY _ZTV6S597C2[];
Class_Descriptor cd_S597C2 = {  "S597C2", // class name
  bases_S597C2, 3,
  &(vtc_S597C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1352,1040), // object size
  NSPAIRA(_ZTI6S597C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S597C2),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S597C1  : S597C2 {
  ::S10103C84 s597c1f0;
  virtual  ~S597C1(); // _ZN6S597C1D1Ev
  virtual void  v1(); // _ZN6S597C12v1Ev
  virtual void  v2(); // _ZN6S597C12v2Ev
  virtual void  v3(); // _ZN6S597C12v3Ev
  S597C1(); // tgen
};
//SIG(1 S597C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC12{ m Fp Fi[2] FC11} FC13{ m FC14{ m FL[2]}} FC6} v28 v29 v30 v31 Fi Fc[2] Fi} vd v32 v33 v34 v35 FC15{ BC16{ BC17{ vd v40 v41 v42 v43 v44 v45 v46 v47 v48 v49 Fp[2] FC6 Fp} vd v50 v51 v52 v53 v54 v55 Fp Fi FC9 FC13 Fi} vd v36 v37 v38 v39 FC6[4] FC13 FC13 FC13 FC13 Fi[6]} FC18{ BC19{ BC20{ vd v60 v61 v62 v63 v64 v65 v66 v67 v68 v69 Fp[2] FC6 Fp} vd v70 v71 v72 v73 v74 v75 Fp Fi FC21{ m Fp Fi FC22{ m} FC22} FC13 Fi} vd v56 v57 v58 v59 FC23{ m FC14} FC23 Fi[6] FC24{ m FC25{ m FL}} FC24 Fc[7] Fi[2] FC13 FC13 FC13 FC13 FC13 Fc[7]} FC15 FC15 Fi Fp Fi[2]} vd v1 v2 v3 FC15}


 S597C1 ::~S597C1(){ note_dtor("S597C1", this);}
void  S597C1 ::v1(){vfunc_called(this, "_ZN6S597C12v1Ev");}
void  S597C1 ::v2(){vfunc_called(this, "_ZN6S597C12v2Ev");}
void  S597C1 ::v3(){vfunc_called(this, "_ZN6S597C12v3Ev");}
S597C1 ::S597C1(){ note_ctor("S597C1", this);} // tgen

static void Test_S597C1()
{
  extern Class_Descriptor cd_S597C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(207,317)];
    init_test(&cd_S597C1, buf);
    S597C1 *dp, &lv = *(dp=new (buf) S597C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1648,1264), "sizeof(S597C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S597C1)");
    check_base_class_offset(lv, (S597C5*)(S597C4*)(S597C3*)(S597C2*), 0, "S597C1");
    check_base_class_offset(lv, (S597C4*)(S597C3*)(S597C2*), 0, "S597C1");
    check_base_class_offset(lv, (S597C3*)(S597C2*), 0, "S597C1");
    check_base_class_offset(lv, (S597C2*), 0, "S597C1");
    check_field_offset(lv, s597c1f0, ABISELECT(1352,1040), "S597C1.s597c1f0");
    test_class_info(&lv, &cd_S597C1);
    dp->~S597C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS597C1(Test_S597C1, "S597C1", ABISELECT(1648,1264));

#else // __cplusplus

extern void _ZN6S597C1C1Ev();
extern void _ZN6S597C1D1Ev();
Name_Map name_map_S597C1[] = {
  NSPAIR(_ZN6S597C1C1Ev),
  NSPAIR(_ZN6S597C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S597C5;
extern VTBL_ENTRY _ZTI6S597C5[];
extern  VTBL_ENTRY _ZTV6S597C5[];
extern Class_Descriptor cd_S597C4;
extern VTBL_ENTRY _ZTI6S597C4[];
extern  VTBL_ENTRY _ZTV6S597C4[];
extern Class_Descriptor cd_S597C3;
extern VTBL_ENTRY _ZTI6S597C3[];
extern  VTBL_ENTRY _ZTV6S597C3[];
extern Class_Descriptor cd_S597C2;
extern VTBL_ENTRY _ZTI6S597C2[];
extern  VTBL_ENTRY _ZTV6S597C2[];
static Base_Class bases_S597C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S597C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S597C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S597C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S597C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S597C1[];
extern void _ZN6S597C1D1Ev();
extern void _ZN6S597C1D0Ev();
extern void _ZN6S597C52v4Ev();
extern void _ZN6S597C52v5Ev();
extern void _ZN6S597C52v6Ev();
extern void _ZN6S597C52v7Ev();
extern void _ZN6S597C52v8Ev();
extern void _ZN6S597C52v9Ev();
extern void _ZN6S597C53v10Ev();
extern void _ZN6S597C53v11Ev();
extern void _ZN6S597C53v12Ev();
extern void _ZN6S597C53v13Ev();
extern void _ZN6S597C43v14Ev();
extern void _ZN6S597C43v15Ev();
extern void _ZN6S597C43v16Ev();
extern void _ZN6S597C43v17Ev();
extern void _ZN6S597C43v18Ev();
extern void _ZN6S597C43v19Ev();
extern void _ZN6S597C43v20Ev();
extern void _ZN6S597C43v21Ev();
extern void _ZN6S597C43v22Ev();
extern void _ZN6S597C43v23Ev();
extern void _ZN6S597C43v24Ev();
extern void _ZN6S597C43v25Ev();
extern void _ZN6S597C43v26Ev();
extern void _ZN6S597C43v27Ev();
extern void _ZN6S597C33v28Ev();
extern void _ZN6S597C33v29Ev();
extern void _ZN6S597C33v30Ev();
extern void _ZN6S597C33v31Ev();
extern void _ZN6S597C23v32Ev();
extern void _ZN6S597C23v33Ev();
extern void _ZN6S597C23v34Ev();
extern void _ZN6S597C23v35Ev();
extern void _ZN6S597C12v1Ev();
extern void _ZN6S597C12v2Ev();
extern void _ZN6S597C12v3Ev();
static  VTBL_ENTRY vtc_S597C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S597C1[0]),
  (VTBL_ENTRY)&_ZN6S597C1D1Ev,
  (VTBL_ENTRY)&_ZN6S597C1D0Ev,
  (VTBL_ENTRY)&_ZN6S597C52v4Ev,
  (VTBL_ENTRY)&_ZN6S597C52v5Ev,
  (VTBL_ENTRY)&_ZN6S597C52v6Ev,
  (VTBL_ENTRY)&_ZN6S597C52v7Ev,
  (VTBL_ENTRY)&_ZN6S597C52v8Ev,
  (VTBL_ENTRY)&_ZN6S597C52v9Ev,
  (VTBL_ENTRY)&_ZN6S597C53v10Ev,
  (VTBL_ENTRY)&_ZN6S597C53v11Ev,
  (VTBL_ENTRY)&_ZN6S597C53v12Ev,
  (VTBL_ENTRY)&_ZN6S597C53v13Ev,
  (VTBL_ENTRY)&_ZN6S597C43v14Ev,
  (VTBL_ENTRY)&_ZN6S597C43v15Ev,
  (VTBL_ENTRY)&_ZN6S597C43v16Ev,
  (VTBL_ENTRY)&_ZN6S597C43v17Ev,
  (VTBL_ENTRY)&_ZN6S597C43v18Ev,
  (VTBL_ENTRY)&_ZN6S597C43v19Ev,
  (VTBL_ENTRY)&_ZN6S597C43v20Ev,
  (VTBL_ENTRY)&_ZN6S597C43v21Ev,
  (VTBL_ENTRY)&_ZN6S597C43v22Ev,
  (VTBL_ENTRY)&_ZN6S597C43v23Ev,
  (VTBL_ENTRY)&_ZN6S597C43v24Ev,
  (VTBL_ENTRY)&_ZN6S597C43v25Ev,
  (VTBL_ENTRY)&_ZN6S597C43v26Ev,
  (VTBL_ENTRY)&_ZN6S597C43v27Ev,
  (VTBL_ENTRY)&_ZN6S597C33v28Ev,
  (VTBL_ENTRY)&_ZN6S597C33v29Ev,
  (VTBL_ENTRY)&_ZN6S597C33v30Ev,
  (VTBL_ENTRY)&_ZN6S597C33v31Ev,
  (VTBL_ENTRY)&_ZN6S597C23v32Ev,
  (VTBL_ENTRY)&_ZN6S597C23v33Ev,
  (VTBL_ENTRY)&_ZN6S597C23v34Ev,
  (VTBL_ENTRY)&_ZN6S597C23v35Ev,
  (VTBL_ENTRY)&_ZN6S597C12v1Ev,
  (VTBL_ENTRY)&_ZN6S597C12v2Ev,
  (VTBL_ENTRY)&_ZN6S597C12v3Ev,
};
extern VTBL_ENTRY _ZTI6S597C1[];
extern  VTBL_ENTRY _ZTV6S597C1[];
Class_Descriptor cd_S597C1 = {  "S597C1", // class name
  bases_S597C1, 4,
  &(vtc_S597C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1648,1264), // object size
  NSPAIRA(_ZTI6S597C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S597C1),39, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10099C2  {
  virtual  ~S10099C2(); // _ZN8S10099C2D1Ev
  virtual void  v6(); // _ZN8S10099C22v6Ev
  S10099C2(); // tgen
};
//SIG(-1 S10099C2) C1{ vd v1}


 S10099C2 ::~S10099C2(){ note_dtor("S10099C2", this);}
void  S10099C2 ::v6(){vfunc_called(this, "_ZN8S10099C22v6Ev");}
S10099C2 ::S10099C2(){ note_ctor("S10099C2", this);} // tgen

static void Test_S10099C2()
{
  extern Class_Descriptor cd_S10099C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S10099C2, buf);
    S10099C2 *dp, &lv = *(dp=new (buf) S10099C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10099C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10099C2)");
    test_class_info(&lv, &cd_S10099C2);
    dp->~S10099C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10099C2(Test_S10099C2, "S10099C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S10099C2C1Ev();
extern void _ZN8S10099C2D1Ev();
Name_Map name_map_S10099C2[] = {
  NSPAIR(_ZN8S10099C2C1Ev),
  NSPAIR(_ZN8S10099C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10099C2[];
extern void _ZN8S10099C2D1Ev();
extern void _ZN8S10099C2D0Ev();
extern void _ZN8S10099C22v6Ev();
static  VTBL_ENTRY vtc_S10099C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10099C2[0]),
  (VTBL_ENTRY)&_ZN8S10099C2D1Ev,
  (VTBL_ENTRY)&_ZN8S10099C2D0Ev,
  (VTBL_ENTRY)&_ZN8S10099C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10099C2[];
extern  VTBL_ENTRY _ZTV8S10099C2[];
Class_Descriptor cd_S10099C2 = {  "S10099C2", // class name
  0,0,//no base classes
  &(vtc_S10099C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S10099C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10099C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10099C3  {
  void *s10099c3f0;
  virtual  ~S10099C3(); // _ZN8S10099C3D1Ev
  virtual void  v7(); // _ZN8S10099C32v7Ev
  virtual void  v8(); // _ZN8S10099C32v8Ev
  virtual void  v9(); // _ZN8S10099C32v9Ev
  virtual void  v10(); // _ZN8S10099C33v10Ev
  virtual void  v11(); // _ZN8S10099C33v11Ev
  S10099C3(); // tgen
};
//SIG(-1 S10099C3) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10099C3 ::~S10099C3(){ note_dtor("S10099C3", this);}
void  S10099C3 ::v7(){vfunc_called(this, "_ZN8S10099C32v7Ev");}
void  S10099C3 ::v8(){vfunc_called(this, "_ZN8S10099C32v8Ev");}
void  S10099C3 ::v9(){vfunc_called(this, "_ZN8S10099C32v9Ev");}
void  S10099C3 ::v10(){vfunc_called(this, "_ZN8S10099C33v10Ev");}
void  S10099C3 ::v11(){vfunc_called(this, "_ZN8S10099C33v11Ev");}
S10099C3 ::S10099C3(){ note_ctor("S10099C3", this);} // tgen

static void Test_S10099C3()
{
  extern Class_Descriptor cd_S10099C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_S10099C3, buf);
    S10099C3 *dp, &lv = *(dp=new (buf) S10099C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S10099C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10099C3)");
    check_field_offset(lv, s10099c3f0, ABISELECT(8,4), "S10099C3.s10099c3f0");
    test_class_info(&lv, &cd_S10099C3);
    dp->~S10099C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10099C3(Test_S10099C3, "S10099C3", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN8S10099C3C1Ev();
extern void _ZN8S10099C3D1Ev();
Name_Map name_map_S10099C3[] = {
  NSPAIR(_ZN8S10099C3C1Ev),
  NSPAIR(_ZN8S10099C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10099C3[];
extern void _ZN8S10099C3D1Ev();
extern void _ZN8S10099C3D0Ev();
extern void _ZN8S10099C32v7Ev();
extern void _ZN8S10099C32v8Ev();
extern void _ZN8S10099C32v9Ev();
extern void _ZN8S10099C33v10Ev();
extern void _ZN8S10099C33v11Ev();
static  VTBL_ENTRY vtc_S10099C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10099C3[0]),
  (VTBL_ENTRY)&_ZN8S10099C3D1Ev,
  (VTBL_ENTRY)&_ZN8S10099C3D0Ev,
  (VTBL_ENTRY)&_ZN8S10099C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10099C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10099C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10099C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10099C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10099C3[];
extern  VTBL_ENTRY _ZTV8S10099C3[];
Class_Descriptor cd_S10099C3 = {  "S10099C3", // class name
  0,0,//no base classes
  &(vtc_S10099C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI8S10099C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10099C3),9, //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

struct  S10099C13  {
  void *s10099c13f0;
  ::S10103C13_nt s10099c13f1;
  ::S10103C16_nt s10099c13f2;
  ::S10103C17 s10099c13f3;
  virtual  ~S10099C13(); // _ZN9S10099C13D1Ev
  virtual void  v16(); // _ZN9S10099C133v16Ev
  virtual void  v17(); // _ZN9S10099C133v17Ev
  virtual void  v18(); // _ZN9S10099C133v18Ev
  virtual void  v19(); // _ZN9S10099C133v19Ev
  virtual void  v20(); // _ZN9S10099C133v20Ev
  virtual void  v21(); // _ZN9S10099C133v21Ev
  virtual void  v22(); // _ZN9S10099C133v22Ev
  virtual void  v23(); // _ZN9S10099C133v23Ev
  virtual void  v24(); // _ZN9S10099C133v24Ev
  virtual void  v25(); // _ZN9S10099C133v25Ev
  virtual void  v26(); // _ZN9S10099C133v26Ev
  virtual void  v27(); // _ZN9S10099C133v27Ev
  virtual void  v28(); // _ZN9S10099C133v28Ev
  virtual void  v29(); // _ZN9S10099C133v29Ev
  virtual void  v30(); // _ZN9S10099C133v30Ev
  virtual void  v31(); // _ZN9S10099C133v31Ev
  virtual void  v32(); // _ZN9S10099C133v32Ev
  virtual void  v33(); // _ZN9S10099C133v33Ev
  virtual void  v34(); // _ZN9S10099C133v34Ev
  virtual void  v35(); // _ZN9S10099C133v35Ev
  virtual void  v36(); // _ZN9S10099C133v36Ev
  virtual void  v37(); // _ZN9S10099C133v37Ev
  virtual void  v38(); // _ZN9S10099C133v38Ev
  virtual void  v39(); // _ZN9S10099C133v39Ev
  S10099C13(); // tgen
};
//SIG(-1 S10099C13) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S10099C13 ::~S10099C13(){ note_dtor("S10099C13", this);}
void  S10099C13 ::v16(){vfunc_called(this, "_ZN9S10099C133v16Ev");}
void  S10099C13 ::v17(){vfunc_called(this, "_ZN9S10099C133v17Ev");}
void  S10099C13 ::v18(){vfunc_called(this, "_ZN9S10099C133v18Ev");}
void  S10099C13 ::v19(){vfunc_called(this, "_ZN9S10099C133v19Ev");}
void  S10099C13 ::v20(){vfunc_called(this, "_ZN9S10099C133v20Ev");}
void  S10099C13 ::v21(){vfunc_called(this, "_ZN9S10099C133v21Ev");}
void  S10099C13 ::v22(){vfunc_called(this, "_ZN9S10099C133v22Ev");}
void  S10099C13 ::v23(){vfunc_called(this, "_ZN9S10099C133v23Ev");}
void  S10099C13 ::v24(){vfunc_called(this, "_ZN9S10099C133v24Ev");}
void  S10099C13 ::v25(){vfunc_called(this, "_ZN9S10099C133v25Ev");}
void  S10099C13 ::v26(){vfunc_called(this, "_ZN9S10099C133v26Ev");}
void  S10099C13 ::v27(){vfunc_called(this, "_ZN9S10099C133v27Ev");}
void  S10099C13 ::v28(){vfunc_called(this, "_ZN9S10099C133v28Ev");}
void  S10099C13 ::v29(){vfunc_called(this, "_ZN9S10099C133v29Ev");}
void  S10099C13 ::v30(){vfunc_called(this, "_ZN9S10099C133v30Ev");}
void  S10099C13 ::v31(){vfunc_called(this, "_ZN9S10099C133v31Ev");}
void  S10099C13 ::v32(){vfunc_called(this, "_ZN9S10099C133v32Ev");}
void  S10099C13 ::v33(){vfunc_called(this, "_ZN9S10099C133v33Ev");}
void  S10099C13 ::v34(){vfunc_called(this, "_ZN9S10099C133v34Ev");}
void  S10099C13 ::v35(){vfunc_called(this, "_ZN9S10099C133v35Ev");}
void  S10099C13 ::v36(){vfunc_called(this, "_ZN9S10099C133v36Ev");}
void  S10099C13 ::v37(){vfunc_called(this, "_ZN9S10099C133v37Ev");}
void  S10099C13 ::v38(){vfunc_called(this, "_ZN9S10099C133v38Ev");}
void  S10099C13 ::v39(){vfunc_called(this, "_ZN9S10099C133v39Ev");}
S10099C13 ::S10099C13(){ note_ctor("S10099C13", this);} // tgen

static void Test_S10099C13()
{
  extern Class_Descriptor cd_S10099C13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S10099C13, buf);
    S10099C13 *dp, &lv = *(dp=new (buf) S10099C13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S10099C13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10099C13)");
    check_field_offset(lv, s10099c13f0, ABISELECT(8,4), "S10099C13.s10099c13f0");
    check_field_offset(lv, s10099c13f1, ABISELECT(16,8), "S10099C13.s10099c13f1");
    check_field_offset(lv, s10099c13f2, ABISELECT(40,24), "S10099C13.s10099c13f2");
    check_field_offset(lv, s10099c13f3, ABISELECT(96,64), "S10099C13.s10099c13f3");
    test_class_info(&lv, &cd_S10099C13);
    dp->~S10099C13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10099C13(Test_S10099C13, "S10099C13", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN9S10099C13C1Ev();
extern void _ZN9S10099C13D1Ev();
Name_Map name_map_S10099C13[] = {
  NSPAIR(_ZN9S10099C13C1Ev),
  NSPAIR(_ZN9S10099C13D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI9S10099C13[];
extern void _ZN9S10099C13D1Ev();
extern void _ZN9S10099C13D0Ev();
extern void _ZN9S10099C133v16Ev();
extern void _ZN9S10099C133v17Ev();
extern void _ZN9S10099C133v18Ev();
extern void _ZN9S10099C133v19Ev();
extern void _ZN9S10099C133v20Ev();
extern void _ZN9S10099C133v21Ev();
extern void _ZN9S10099C133v22Ev();
extern void _ZN9S10099C133v23Ev();
extern void _ZN9S10099C133v24Ev();
extern void _ZN9S10099C133v25Ev();
extern void _ZN9S10099C133v26Ev();
extern void _ZN9S10099C133v27Ev();
extern void _ZN9S10099C133v28Ev();
extern void _ZN9S10099C133v29Ev();
extern void _ZN9S10099C133v30Ev();
extern void _ZN9S10099C133v31Ev();
extern void _ZN9S10099C133v32Ev();
extern void _ZN9S10099C133v33Ev();
extern void _ZN9S10099C133v34Ev();
extern void _ZN9S10099C133v35Ev();
extern void _ZN9S10099C133v36Ev();
extern void _ZN9S10099C133v37Ev();
extern void _ZN9S10099C133v38Ev();
extern void _ZN9S10099C133v39Ev();
static  VTBL_ENTRY vtc_S10099C13[] = {
  0,
  (VTBL_ENTRY)&(_ZTI9S10099C13[0]),
  (VTBL_ENTRY)&_ZN9S10099C13D1Ev,
  (VTBL_ENTRY)&_ZN9S10099C13D0Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v16Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v17Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v18Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v19Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v20Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v21Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v22Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v23Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v24Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v25Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v26Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v27Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v28Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v29Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v30Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v31Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v32Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v33Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v34Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v35Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v36Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v37Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v38Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v39Ev,
};
extern VTBL_ENTRY _ZTI9S10099C13[];
extern  VTBL_ENTRY _ZTV9S10099C13[];
Class_Descriptor cd_S10099C13 = {  "S10099C13", // class name
  0,0,//no base classes
  &(vtc_S10099C13[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI9S10099C13),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV9S10099C13),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10099C5  : S10103C5_nt , S10099C13 {
  virtual  ~S10099C5(); // _ZN8S10099C5D1Ev
  virtual void  v40(); // _ZN8S10099C53v40Ev
  virtual void  v41(); // _ZN8S10099C53v41Ev
  virtual void  v42(); // _ZN8S10099C53v42Ev
  virtual void  v43(); // _ZN8S10099C53v43Ev
  virtual void  v44(); // _ZN8S10099C53v44Ev
  virtual void  v45(); // _ZN8S10099C53v45Ev
  virtual void  v46(); // _ZN8S10099C53v46Ev
  virtual void  v47(); // _ZN8S10099C53v47Ev
  virtual void  v48(); // _ZN8S10099C53v48Ev
  S10099C5(); // tgen
};
//SIG(-1 S10099C5) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 v2 v3 v4 v5 v6 v7 v8 v9}


 S10099C5 ::~S10099C5(){ note_dtor("S10099C5", this);}
void  S10099C5 ::v40(){vfunc_called(this, "_ZN8S10099C53v40Ev");}
void  S10099C5 ::v41(){vfunc_called(this, "_ZN8S10099C53v41Ev");}
void  S10099C5 ::v42(){vfunc_called(this, "_ZN8S10099C53v42Ev");}
void  S10099C5 ::v43(){vfunc_called(this, "_ZN8S10099C53v43Ev");}
void  S10099C5 ::v44(){vfunc_called(this, "_ZN8S10099C53v44Ev");}
void  S10099C5 ::v45(){vfunc_called(this, "_ZN8S10099C53v45Ev");}
void  S10099C5 ::v46(){vfunc_called(this, "_ZN8S10099C53v46Ev");}
void  S10099C5 ::v47(){vfunc_called(this, "_ZN8S10099C53v47Ev");}
void  S10099C5 ::v48(){vfunc_called(this, "_ZN8S10099C53v48Ev");}
S10099C5 ::S10099C5(){ note_ctor("S10099C5", this);} // tgen

static void Test_S10099C5()
{
  extern Class_Descriptor cd_S10099C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(22,29)];
    init_test(&cd_S10099C5, buf);
    S10099C5 *dp, &lv = *(dp=new (buf) S10099C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(168,112), "sizeof(S10099C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10099C5)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S10099C5");
    check_base_class_offset(lv, (S10099C13*), ABISELECT(48,32), "S10099C5");
    test_class_info(&lv, &cd_S10099C5);
    dp->~S10099C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10099C5(Test_S10099C5, "S10099C5", ABISELECT(168,112));

#else // __cplusplus

extern void _ZN8S10099C5C1Ev();
extern void _ZN8S10099C5D1Ev();
Name_Map name_map_S10099C5[] = {
  NSPAIR(_ZN8S10099C5C1Ev),
  NSPAIR(_ZN8S10099C5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10099C13;
extern VTBL_ENTRY _ZTI9S10099C13[];
extern  VTBL_ENTRY _ZTV9S10099C13[];
static Base_Class bases_S10099C5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10099C13,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10099C5[];
extern void _ZN8S10099C5D1Ev();
extern void _ZN8S10099C5D0Ev();
extern void _ZN8S10099C53v40Ev();
extern void _ZN8S10099C53v41Ev();
extern void _ZN8S10099C53v42Ev();
extern void _ZN8S10099C53v43Ev();
extern void _ZN8S10099C53v44Ev();
extern void _ZN8S10099C53v45Ev();
extern void _ZN8S10099C53v46Ev();
extern void _ZN8S10099C53v47Ev();
extern void _ZN8S10099C53v48Ev();
extern void ABISELECT(_ZThn48_N8S10099C5D1Ev,_ZThn32_N8S10099C5D1Ev)();
extern void ABISELECT(_ZThn48_N8S10099C5D0Ev,_ZThn32_N8S10099C5D0Ev)();
extern void _ZN9S10099C133v16Ev();
extern void _ZN9S10099C133v17Ev();
extern void _ZN9S10099C133v18Ev();
extern void _ZN9S10099C133v19Ev();
extern void _ZN9S10099C133v20Ev();
extern void _ZN9S10099C133v21Ev();
extern void _ZN9S10099C133v22Ev();
extern void _ZN9S10099C133v23Ev();
extern void _ZN9S10099C133v24Ev();
extern void _ZN9S10099C133v25Ev();
extern void _ZN9S10099C133v26Ev();
extern void _ZN9S10099C133v27Ev();
extern void _ZN9S10099C133v28Ev();
extern void _ZN9S10099C133v29Ev();
extern void _ZN9S10099C133v30Ev();
extern void _ZN9S10099C133v31Ev();
extern void _ZN9S10099C133v32Ev();
extern void _ZN9S10099C133v33Ev();
extern void _ZN9S10099C133v34Ev();
extern void _ZN9S10099C133v35Ev();
extern void _ZN9S10099C133v36Ev();
extern void _ZN9S10099C133v37Ev();
extern void _ZN9S10099C133v38Ev();
extern void _ZN9S10099C133v39Ev();
static  VTBL_ENTRY vtc_S10099C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10099C5[0]),
  (VTBL_ENTRY)&_ZN8S10099C5D1Ev,
  (VTBL_ENTRY)&_ZN8S10099C5D0Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v40Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v41Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v42Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v43Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v44Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v45Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v46Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v47Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v48Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8S10099C5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10099C5D1Ev,_ZThn32_N8S10099C5D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10099C5D0Ev,_ZThn32_N8S10099C5D0Ev),
  (VTBL_ENTRY)&_ZN9S10099C133v16Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v17Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v18Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v19Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v20Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v21Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v22Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v23Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v24Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v25Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v26Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v27Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v28Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v29Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v30Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v31Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v32Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v33Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v34Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v35Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v36Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v37Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v38Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v39Ev,
};
extern VTBL_ENTRY _ZTI8S10099C5[];
extern  VTBL_ENTRY _ZTV8S10099C5[];
Class_Descriptor cd_S10099C5 = {  "S10099C5", // class name
  bases_S10099C5, 2,
  &(vtc_S10099C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(168,112), // object size
  NSPAIRA(_ZTI8S10099C5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10099C5),41, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10099C4  : S10099C5 , S10099C2 {
  ::S10103C106 s10099c4f0;
  ::S10103C29 s10099c4f1;
  int s10099c4f2[2];
  virtual  ~S10099C4(); // _ZN8S10099C4D1Ev
  virtual void  v12(); // _ZN8S10099C43v12Ev
  virtual void  v13(); // _ZN8S10099C43v13Ev
  virtual void  v14(); // _ZN8S10099C43v14Ev
  virtual void  v15(); // _ZN8S10099C43v15Ev
  S10099C4(); // tgen
};
//SIG(-1 S10099C4) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v29 v30 v31 v32 v33 v34 v35 v36 v37} BC12{ vd v38} vd v1 v2 v3 v4 FC13{ m Fp Fi[2] FC14{ m}} FC15{ m Fi Fp Fi Fp[2] Fi} Fi[2]}


 S10099C4 ::~S10099C4(){ note_dtor("S10099C4", this);}
void  S10099C4 ::v12(){vfunc_called(this, "_ZN8S10099C43v12Ev");}
void  S10099C4 ::v13(){vfunc_called(this, "_ZN8S10099C43v13Ev");}
void  S10099C4 ::v14(){vfunc_called(this, "_ZN8S10099C43v14Ev");}
void  S10099C4 ::v15(){vfunc_called(this, "_ZN8S10099C43v15Ev");}
S10099C4 ::S10099C4(){ note_ctor("S10099C4", this);} // tgen

static void Test_S10099C4()
{
  extern Class_Descriptor cd_S10099C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,42)];
    init_test(&cd_S10099C4, buf);
    S10099C4 *dp, &lv = *(dp=new (buf) S10099C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,164), "sizeof(S10099C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10099C4)");
    check_base_class_offset(lv, (S10103C5_nt*)(S10099C5*), 0, "S10099C4");
    check_base_class_offset(lv, (S10099C13*)(S10099C5*), ABISELECT(48,32), "S10099C4");
    check_base_class_offset(lv, (S10099C5*), 0, "S10099C4");
    check_base_class_offset(lv, (S10099C2*), ABISELECT(168,112), "S10099C4");
    check_field_offset(lv, s10099c4f0, ABISELECT(176,116), "S10099C4.s10099c4f0");
    check_field_offset(lv, s10099c4f1, ABISELECT(200,132), "S10099C4.s10099c4f1");
    check_field_offset(lv, s10099c4f2, ABISELECT(248,156), "S10099C4.s10099c4f2");
    test_class_info(&lv, &cd_S10099C4);
    dp->~S10099C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10099C4(Test_S10099C4, "S10099C4", ABISELECT(256,164));

#else // __cplusplus

extern void _ZN8S10099C4C1Ev();
extern void _ZN8S10099C4D1Ev();
Name_Map name_map_S10099C4[] = {
  NSPAIR(_ZN8S10099C4C1Ev),
  NSPAIR(_ZN8S10099C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S10099C13;
extern VTBL_ENTRY _ZTI9S10099C13[];
extern  VTBL_ENTRY _ZTV9S10099C13[];
extern Class_Descriptor cd_S10099C5;
extern VTBL_ENTRY _ZTI8S10099C5[];
extern  VTBL_ENTRY _ZTV8S10099C5[];
extern Class_Descriptor cd_S10099C2;
extern VTBL_ENTRY _ZTI8S10099C2[];
extern  VTBL_ENTRY _ZTV8S10099C2[];
static Base_Class bases_S10099C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10099C13,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S10099C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10099C2,    ABISELECT(168,112), //bcp->offset
    45, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10099C4[];
extern void _ZN8S10099C4D1Ev();
extern void _ZN8S10099C4D0Ev();
extern void _ZN8S10099C53v40Ev();
extern void _ZN8S10099C53v41Ev();
extern void _ZN8S10099C53v42Ev();
extern void _ZN8S10099C53v43Ev();
extern void _ZN8S10099C53v44Ev();
extern void _ZN8S10099C53v45Ev();
extern void _ZN8S10099C53v46Ev();
extern void _ZN8S10099C53v47Ev();
extern void _ZN8S10099C53v48Ev();
extern void _ZN8S10099C43v12Ev();
extern void _ZN8S10099C43v13Ev();
extern void _ZN8S10099C43v14Ev();
extern void _ZN8S10099C43v15Ev();
extern void ABISELECT(_ZThn48_N8S10099C4D1Ev,_ZThn32_N8S10099C4D1Ev)();
extern void ABISELECT(_ZThn48_N8S10099C4D0Ev,_ZThn32_N8S10099C4D0Ev)();
extern void _ZN9S10099C133v16Ev();
extern void _ZN9S10099C133v17Ev();
extern void _ZN9S10099C133v18Ev();
extern void _ZN9S10099C133v19Ev();
extern void _ZN9S10099C133v20Ev();
extern void _ZN9S10099C133v21Ev();
extern void _ZN9S10099C133v22Ev();
extern void _ZN9S10099C133v23Ev();
extern void _ZN9S10099C133v24Ev();
extern void _ZN9S10099C133v25Ev();
extern void _ZN9S10099C133v26Ev();
extern void _ZN9S10099C133v27Ev();
extern void _ZN9S10099C133v28Ev();
extern void _ZN9S10099C133v29Ev();
extern void _ZN9S10099C133v30Ev();
extern void _ZN9S10099C133v31Ev();
extern void _ZN9S10099C133v32Ev();
extern void _ZN9S10099C133v33Ev();
extern void _ZN9S10099C133v34Ev();
extern void _ZN9S10099C133v35Ev();
extern void _ZN9S10099C133v36Ev();
extern void _ZN9S10099C133v37Ev();
extern void _ZN9S10099C133v38Ev();
extern void _ZN9S10099C133v39Ev();
extern void ABISELECT(_ZThn168_N8S10099C4D1Ev,_ZThn112_N8S10099C4D1Ev)();
extern void ABISELECT(_ZThn168_N8S10099C4D0Ev,_ZThn112_N8S10099C4D0Ev)();
extern void _ZN8S10099C22v6Ev();
static  VTBL_ENTRY vtc_S10099C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10099C4[0]),
  (VTBL_ENTRY)&_ZN8S10099C4D1Ev,
  (VTBL_ENTRY)&_ZN8S10099C4D0Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v40Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v41Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v42Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v43Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v44Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v45Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v46Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v47Ev,
  (VTBL_ENTRY)&_ZN8S10099C53v48Ev,
  (VTBL_ENTRY)&_ZN8S10099C43v12Ev,
  (VTBL_ENTRY)&_ZN8S10099C43v13Ev,
  (VTBL_ENTRY)&_ZN8S10099C43v14Ev,
  (VTBL_ENTRY)&_ZN8S10099C43v15Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8S10099C4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10099C4D1Ev,_ZThn32_N8S10099C4D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N8S10099C4D0Ev,_ZThn32_N8S10099C4D0Ev),
  (VTBL_ENTRY)&_ZN9S10099C133v16Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v17Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v18Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v19Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v20Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v21Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v22Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v23Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v24Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v25Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v26Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v27Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v28Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v29Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v30Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v31Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v32Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v33Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v34Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v35Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v36Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v37Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v38Ev,
  (VTBL_ENTRY)&_ZN9S10099C133v39Ev,
  ABISELECT(-168,-112),
  (VTBL_ENTRY)&(_ZTI8S10099C4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn168_N8S10099C4D1Ev,_ZThn112_N8S10099C4D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn168_N8S10099C4D0Ev,_ZThn112_N8S10099C4D0Ev),
  (VTBL_ENTRY)&_ZN8S10099C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10099C4[];
extern  VTBL_ENTRY _ZTV8S10099C4[];
Class_Descriptor cd_S10099C4 = {  "S10099C4", // class name
  bases_S10099C4, 4,
  &(vtc_S10099C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,164), // object size
  NSPAIRA(_ZTI8S10099C4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10099C4),50, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10099C1  : S10099C2 , S10099C3 {
  ::S10099C4 s10099c1f0;
  ::S10103C49 s10099c1f1;
  ::S10103C105 s10099c1f2;
  int s10099c1f3;
  char s10099c1f4;
  ::S10103C14_nt s10099c1f5;
  void *s10099c1f6;
  virtual  ~S10099C1(); // _ZN8S10099C1D1Ev
  virtual void  v1(); // _ZN8S10099C12v1Ev
  virtual void  v2(); // _ZN8S10099C12v2Ev
  virtual void  v3(); // _ZN8S10099C12v3Ev
  virtual void  v4(); // _ZN8S10099C12v4Ev
  virtual void  v5(); // _ZN8S10099C12v5Ev
  S10099C1(); // tgen
};
//SIG(1 S10099C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 FC4{ BC5{ BC6{ vd m FC7{ m Fp Fi FC8{ m} FC8} FC7 Fc} BC9{ vd v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 Fp FC10{ m FC11{ m Fp Fi FC12{ m}} Fi} FC13{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC14{ m Fc Fi[2] Fp}} vd v40 v41 v42 v43 v44 v45 v46 v47 v48} BC2 vd v12 v13 v14 v15 FC15{ m Fp Fi[2] FC16{ m}} FC17{ m Fi Fp Fi Fp[2] Fi} Fi[2]} FC18{ BC19{ BC6 vd v51 v52 v53 v54 FC20{ m Fp FC10 FC11 FC11 Fi} Fp Fc Fi} v49 v50} FC21{ m Fp} Fi Fc FC11 Fp}


 S10099C1 ::~S10099C1(){ note_dtor("S10099C1", this);}
void  S10099C1 ::v1(){vfunc_called(this, "_ZN8S10099C12v1Ev");}
void  S10099C1 ::v2(){vfunc_called(this, "_ZN8S10099C12v2Ev");}
void  S10099C1 ::v3(){vfunc_called(this, "_ZN8S10099C12v3Ev");}
void  S10099C1 ::v4(){vfunc_called(this, "_ZN8S10099C12v4Ev");}
void  S10099C1 ::v5(){vfunc_called(this, "_ZN8S10099C12v5Ev");}
S10099C1 ::S10099C1(){ note_ctor("S10099C1", this);} // tgen

static void Test_S10099C1()
{
  extern Class_Descriptor cd_S10099C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(58,75)];
    init_test(&cd_S10099C1, buf);
    S10099C1 *dp, &lv = *(dp=new (buf) S10099C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(456,296), "sizeof(S10099C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10099C1)");
    check_base_class_offset(lv, (S10099C2*), 0, "S10099C1");
    check_base_class_offset(lv, (S10099C3*), ABISELECT(8,4), "S10099C1");
    check_field_offset(lv, s10099c1f0, ABISELECT(24,12), "S10099C1.s10099c1f0");
    check_field_offset(lv, s10099c1f1, ABISELECT(280,176), "S10099C1.s10099c1f1");
    check_field_offset(lv, s10099c1f2, ABISELECT(416,268), "S10099C1.s10099c1f2");
    check_field_offset(lv, s10099c1f3, ABISELECT(424,272), "S10099C1.s10099c1f3");
    check_field_offset(lv, s10099c1f4, ABISELECT(428,276), "S10099C1.s10099c1f4");
    check_field_offset(lv, s10099c1f5, ABISELECT(432,280), "S10099C1.s10099c1f5");
    check_field_offset(lv, s10099c1f6, ABISELECT(448,292), "S10099C1.s10099c1f6");
    test_class_info(&lv, &cd_S10099C1);
    dp->~S10099C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10099C1(Test_S10099C1, "S10099C1", ABISELECT(456,296));

#else // __cplusplus

extern void _ZN8S10099C1C1Ev();
extern void _ZN8S10099C1D1Ev();
Name_Map name_map_S10099C1[] = {
  NSPAIR(_ZN8S10099C1C1Ev),
  NSPAIR(_ZN8S10099C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10099C2;
extern VTBL_ENTRY _ZTI8S10099C2[];
extern  VTBL_ENTRY _ZTV8S10099C2[];
extern Class_Descriptor cd_S10099C3;
extern VTBL_ENTRY _ZTI8S10099C3[];
extern  VTBL_ENTRY _ZTV8S10099C3[];
static Base_Class bases_S10099C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10099C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10099C3,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10099C1[];
extern void _ZN8S10099C1D1Ev();
extern void _ZN8S10099C1D0Ev();
extern void _ZN8S10099C22v6Ev();
extern void _ZN8S10099C12v1Ev();
extern void _ZN8S10099C12v2Ev();
extern void _ZN8S10099C12v3Ev();
extern void _ZN8S10099C12v4Ev();
extern void _ZN8S10099C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10099C1D1Ev,_ZThn4_N8S10099C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10099C1D0Ev,_ZThn4_N8S10099C1D0Ev)();
extern void _ZN8S10099C32v7Ev();
extern void _ZN8S10099C32v8Ev();
extern void _ZN8S10099C32v9Ev();
extern void _ZN8S10099C33v10Ev();
extern void _ZN8S10099C33v11Ev();
static  VTBL_ENTRY vtc_S10099C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10099C1[0]),
  (VTBL_ENTRY)&_ZN8S10099C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10099C1D0Ev,
  (VTBL_ENTRY)&_ZN8S10099C22v6Ev,
  (VTBL_ENTRY)&_ZN8S10099C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10099C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10099C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10099C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10099C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10099C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10099C1D1Ev,_ZThn4_N8S10099C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10099C1D0Ev,_ZThn4_N8S10099C1D0Ev),
  (VTBL_ENTRY)&_ZN8S10099C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10099C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10099C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10099C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10099C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10099C1[];
extern  VTBL_ENTRY _ZTV8S10099C1[];
Class_Descriptor cd_S10099C1 = {  "S10099C1", // class name
  bases_S10099C1, 2,
  &(vtc_S10099C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(456,296), // object size
  NSPAIRA(_ZTI8S10099C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10099C1),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1489C4  {
  void *s1489c4f0[2];
  ::S10103C13_nt s1489c4f1;
  void *s1489c4f2;
  virtual  ~S1489C4(); // _ZN7S1489C4D1Ev
  virtual void  v5(); // _ZN7S1489C42v5Ev
  virtual void  v6(); // _ZN7S1489C42v6Ev
  virtual void  v7(); // _ZN7S1489C42v7Ev
  virtual void  v8(); // _ZN7S1489C42v8Ev
  virtual void  v9(); // _ZN7S1489C42v9Ev
  virtual void  v10(); // _ZN7S1489C43v10Ev
  virtual void  v11(); // _ZN7S1489C43v11Ev
  virtual void  v12(); // _ZN7S1489C43v12Ev
  virtual void  v13(); // _ZN7S1489C43v13Ev
  virtual void  v14(); // _ZN7S1489C43v14Ev
  S1489C4(); // tgen
};
//SIG(-1 S1489C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1489C4 ::~S1489C4(){ note_dtor("S1489C4", this);}
void  S1489C4 ::v5(){vfunc_called(this, "_ZN7S1489C42v5Ev");}
void  S1489C4 ::v6(){vfunc_called(this, "_ZN7S1489C42v6Ev");}
void  S1489C4 ::v7(){vfunc_called(this, "_ZN7S1489C42v7Ev");}
void  S1489C4 ::v8(){vfunc_called(this, "_ZN7S1489C42v8Ev");}
void  S1489C4 ::v9(){vfunc_called(this, "_ZN7S1489C42v9Ev");}
void  S1489C4 ::v10(){vfunc_called(this, "_ZN7S1489C43v10Ev");}
void  S1489C4 ::v11(){vfunc_called(this, "_ZN7S1489C43v11Ev");}
void  S1489C4 ::v12(){vfunc_called(this, "_ZN7S1489C43v12Ev");}
void  S1489C4 ::v13(){vfunc_called(this, "_ZN7S1489C43v13Ev");}
void  S1489C4 ::v14(){vfunc_called(this, "_ZN7S1489C43v14Ev");}
S1489C4 ::S1489C4(){ note_ctor("S1489C4", this);} // tgen

static void Test_S1489C4()
{
  extern Class_Descriptor cd_S1489C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1489C4, buf);
    S1489C4 *dp, &lv = *(dp=new (buf) S1489C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1489C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1489C4)");
    check_field_offset(lv, s1489c4f0, ABISELECT(8,4), "S1489C4.s1489c4f0");
    check_field_offset(lv, s1489c4f1, ABISELECT(24,12), "S1489C4.s1489c4f1");
    check_field_offset(lv, s1489c4f2, ABISELECT(48,28), "S1489C4.s1489c4f2");
    test_class_info(&lv, &cd_S1489C4);
    dp->~S1489C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1489C4(Test_S1489C4, "S1489C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1489C4C1Ev();
extern void _ZN7S1489C4D1Ev();
Name_Map name_map_S1489C4[] = {
  NSPAIR(_ZN7S1489C4C1Ev),
  NSPAIR(_ZN7S1489C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1489C4[];
extern void _ZN7S1489C4D1Ev();
extern void _ZN7S1489C4D0Ev();
extern void _ZN7S1489C42v5Ev();
extern void _ZN7S1489C42v6Ev();
extern void _ZN7S1489C42v7Ev();
extern void _ZN7S1489C42v8Ev();
extern void _ZN7S1489C42v9Ev();
extern void _ZN7S1489C43v10Ev();
extern void _ZN7S1489C43v11Ev();
extern void _ZN7S1489C43v12Ev();
extern void _ZN7S1489C43v13Ev();
extern void _ZN7S1489C43v14Ev();
static  VTBL_ENTRY vtc_S1489C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1489C4[0]),
  (VTBL_ENTRY)&_ZN7S1489C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1489C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1489C4[];
extern  VTBL_ENTRY _ZTV7S1489C4[];
Class_Descriptor cd_S1489C4 = {  "S1489C4", // class name
  0,0,//no base classes
  &(vtc_S1489C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1489C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1489C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1489C3  : S1489C4 {
  ::S10103C86 s1489c3f0;
  ::S10103C106 s1489c3f1;
  ::S10103C82_nt s1489c3f2;
  ::S10103C13_nt s1489c3f3;
  virtual  ~S1489C3(); // _ZN7S1489C3D1Ev
  virtual void  v15(); // _ZN7S1489C33v15Ev
  virtual void  v16(); // _ZN7S1489C33v16Ev
  virtual void  v17(); // _ZN7S1489C33v17Ev
  virtual void  v18(); // _ZN7S1489C33v18Ev
  virtual void  v19(); // _ZN7S1489C33v19Ev
  virtual void  v20(); // _ZN7S1489C33v20Ev
  virtual void  v21(); // _ZN7S1489C33v21Ev
  virtual void  v22(); // _ZN7S1489C33v22Ev
  virtual void  v23(); // _ZN7S1489C33v23Ev
  virtual void  v24(); // _ZN7S1489C33v24Ev
  virtual void  v25(); // _ZN7S1489C33v25Ev
  virtual void  v26(); // _ZN7S1489C33v26Ev
  virtual void  v27(); // _ZN7S1489C33v27Ev
  virtual void  v28(); // _ZN7S1489C33v28Ev
  S1489C3(); // tgen
};
//SIG(-1 S1489C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1489C3 ::~S1489C3(){ note_dtor("S1489C3", this);}
void  S1489C3 ::v15(){vfunc_called(this, "_ZN7S1489C33v15Ev");}
void  S1489C3 ::v16(){vfunc_called(this, "_ZN7S1489C33v16Ev");}
void  S1489C3 ::v17(){vfunc_called(this, "_ZN7S1489C33v17Ev");}
void  S1489C3 ::v18(){vfunc_called(this, "_ZN7S1489C33v18Ev");}
void  S1489C3 ::v19(){vfunc_called(this, "_ZN7S1489C33v19Ev");}
void  S1489C3 ::v20(){vfunc_called(this, "_ZN7S1489C33v20Ev");}
void  S1489C3 ::v21(){vfunc_called(this, "_ZN7S1489C33v21Ev");}
void  S1489C3 ::v22(){vfunc_called(this, "_ZN7S1489C33v22Ev");}
void  S1489C3 ::v23(){vfunc_called(this, "_ZN7S1489C33v23Ev");}
void  S1489C3 ::v24(){vfunc_called(this, "_ZN7S1489C33v24Ev");}
void  S1489C3 ::v25(){vfunc_called(this, "_ZN7S1489C33v25Ev");}
void  S1489C3 ::v26(){vfunc_called(this, "_ZN7S1489C33v26Ev");}
void  S1489C3 ::v27(){vfunc_called(this, "_ZN7S1489C33v27Ev");}
void  S1489C3 ::v28(){vfunc_called(this, "_ZN7S1489C33v28Ev");}
S1489C3 ::S1489C3(){ note_ctor("S1489C3", this);} // tgen

static void Test_S1489C3()
{
  extern Class_Descriptor cd_S1489C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1489C3, buf);
    S1489C3 *dp, &lv = *(dp=new (buf) S1489C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1489C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1489C3)");
    check_base_class_offset(lv, (S1489C4*), 0, "S1489C3");
    check_field_offset(lv, s1489c3f0, ABISELECT(56,32), "S1489C3.s1489c3f0");
    check_field_offset(lv, s1489c3f1, ABISELECT(72,44), "S1489C3.s1489c3f1");
    check_field_offset(lv, s1489c3f2, ABISELECT(96,60), "S1489C3.s1489c3f2");
    check_field_offset(lv, s1489c3f3, ABISELECT(112,76), "S1489C3.s1489c3f3");
    test_class_info(&lv, &cd_S1489C3);
    dp->~S1489C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1489C3(Test_S1489C3, "S1489C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1489C3C1Ev();
extern void _ZN7S1489C3D1Ev();
Name_Map name_map_S1489C3[] = {
  NSPAIR(_ZN7S1489C3C1Ev),
  NSPAIR(_ZN7S1489C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1489C4;
extern VTBL_ENTRY _ZTI7S1489C4[];
extern  VTBL_ENTRY _ZTV7S1489C4[];
static Base_Class bases_S1489C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1489C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1489C3[];
extern void _ZN7S1489C3D1Ev();
extern void _ZN7S1489C3D0Ev();
extern void _ZN7S1489C42v5Ev();
extern void _ZN7S1489C42v6Ev();
extern void _ZN7S1489C42v7Ev();
extern void _ZN7S1489C42v8Ev();
extern void _ZN7S1489C42v9Ev();
extern void _ZN7S1489C43v10Ev();
extern void _ZN7S1489C43v11Ev();
extern void _ZN7S1489C43v12Ev();
extern void _ZN7S1489C43v13Ev();
extern void _ZN7S1489C43v14Ev();
extern void _ZN7S1489C33v15Ev();
extern void _ZN7S1489C33v16Ev();
extern void _ZN7S1489C33v17Ev();
extern void _ZN7S1489C33v18Ev();
extern void _ZN7S1489C33v19Ev();
extern void _ZN7S1489C33v20Ev();
extern void _ZN7S1489C33v21Ev();
extern void _ZN7S1489C33v22Ev();
extern void _ZN7S1489C33v23Ev();
extern void _ZN7S1489C33v24Ev();
extern void _ZN7S1489C33v25Ev();
extern void _ZN7S1489C33v26Ev();
extern void _ZN7S1489C33v27Ev();
extern void _ZN7S1489C33v28Ev();
static  VTBL_ENTRY vtc_S1489C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1489C3[0]),
  (VTBL_ENTRY)&_ZN7S1489C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1489C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v28Ev,
};
extern VTBL_ENTRY _ZTI7S1489C3[];
extern  VTBL_ENTRY _ZTV7S1489C3[];
Class_Descriptor cd_S1489C3 = {  "S1489C3", // class name
  bases_S1489C3, 1,
  &(vtc_S1489C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1489C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1489C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1489C2  : S1489C3 {
  int s1489c2f0;
  char s1489c2f1[2];
  int s1489c2f2;
  virtual void  v29(); // _ZN7S1489C23v29Ev
  virtual void  v30(); // _ZN7S1489C23v30Ev
  virtual void  v31(); // _ZN7S1489C23v31Ev
  virtual void  v32(); // _ZN7S1489C23v32Ev
  ~S1489C2(); // tgen
  S1489C2(); // tgen
};
//SIG(-1 S1489C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 Fi Fc[2] Fi}


void  S1489C2 ::v29(){vfunc_called(this, "_ZN7S1489C23v29Ev");}
void  S1489C2 ::v30(){vfunc_called(this, "_ZN7S1489C23v30Ev");}
void  S1489C2 ::v31(){vfunc_called(this, "_ZN7S1489C23v31Ev");}
void  S1489C2 ::v32(){vfunc_called(this, "_ZN7S1489C23v32Ev");}
S1489C2 ::~S1489C2(){ note_dtor("S1489C2", this);} // tgen
S1489C2 ::S1489C2(){ note_ctor("S1489C2", this);} // tgen

static void Test_S1489C2()
{
  extern Class_Descriptor cd_S1489C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S1489C2, buf);
    S1489C2 *dp, &lv = *(dp=new (buf) S1489C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S1489C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1489C2)");
    check_base_class_offset(lv, (S1489C4*)(S1489C3*), 0, "S1489C2");
    check_base_class_offset(lv, (S1489C3*), 0, "S1489C2");
    check_field_offset(lv, s1489c2f0, ABISELECT(136,92), "S1489C2.s1489c2f0");
    check_field_offset(lv, s1489c2f1, ABISELECT(140,96), "S1489C2.s1489c2f1");
    check_field_offset(lv, s1489c2f2, ABISELECT(144,100), "S1489C2.s1489c2f2");
    test_class_info(&lv, &cd_S1489C2);
    dp->~S1489C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1489C2(Test_S1489C2, "S1489C2", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN7S1489C2C1Ev();
extern void _ZN7S1489C2D1Ev();
Name_Map name_map_S1489C2[] = {
  NSPAIR(_ZN7S1489C2C1Ev),
  NSPAIR(_ZN7S1489C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1489C4;
extern VTBL_ENTRY _ZTI7S1489C4[];
extern  VTBL_ENTRY _ZTV7S1489C4[];
extern Class_Descriptor cd_S1489C3;
extern VTBL_ENTRY _ZTI7S1489C3[];
extern  VTBL_ENTRY _ZTV7S1489C3[];
static Base_Class bases_S1489C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1489C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1489C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1489C2[];
extern void _ZN7S1489C2D1Ev();
extern void _ZN7S1489C2D0Ev();
extern void _ZN7S1489C42v5Ev();
extern void _ZN7S1489C42v6Ev();
extern void _ZN7S1489C42v7Ev();
extern void _ZN7S1489C42v8Ev();
extern void _ZN7S1489C42v9Ev();
extern void _ZN7S1489C43v10Ev();
extern void _ZN7S1489C43v11Ev();
extern void _ZN7S1489C43v12Ev();
extern void _ZN7S1489C43v13Ev();
extern void _ZN7S1489C43v14Ev();
extern void _ZN7S1489C33v15Ev();
extern void _ZN7S1489C33v16Ev();
extern void _ZN7S1489C33v17Ev();
extern void _ZN7S1489C33v18Ev();
extern void _ZN7S1489C33v19Ev();
extern void _ZN7S1489C33v20Ev();
extern void _ZN7S1489C33v21Ev();
extern void _ZN7S1489C33v22Ev();
extern void _ZN7S1489C33v23Ev();
extern void _ZN7S1489C33v24Ev();
extern void _ZN7S1489C33v25Ev();
extern void _ZN7S1489C33v26Ev();
extern void _ZN7S1489C33v27Ev();
extern void _ZN7S1489C33v28Ev();
extern void _ZN7S1489C23v29Ev();
extern void _ZN7S1489C23v30Ev();
extern void _ZN7S1489C23v31Ev();
extern void _ZN7S1489C23v32Ev();
static  VTBL_ENTRY vtc_S1489C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1489C2[0]),
  (VTBL_ENTRY)&_ZN7S1489C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1489C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v32Ev,
};
extern VTBL_ENTRY _ZTI7S1489C2[];
extern  VTBL_ENTRY _ZTV7S1489C2[];
Class_Descriptor cd_S1489C2 = {  "S1489C2", // class name
  bases_S1489C2, 2,
  &(vtc_S1489C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI7S1489C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1489C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1489C1  : S1489C2 {
  ::S10103C84 s1489c1f0;
  ::S679C23 s1489c1f1;
  ::S10103C84 s1489c1f2;
  ::S10103C84 s1489c1f3;
  void *s1489c1f4;
  int s1489c1f5[2];
  virtual  ~S1489C1(); // _ZN7S1489C1D1Ev
  virtual void  v1(); // _ZN7S1489C12v1Ev
  virtual void  v2(); // _ZN7S1489C12v2Ev
  virtual void  v3(); // _ZN7S1489C12v3Ev
  virtual void  v4(); // _ZN7S1489C12v4Ev
  S1489C1(); // tgen
};
//SIG(1 S1489C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 Fi Fc[2] Fi} vd v1 v2 v3 v4 FC14{ BC15{ BC16{ vd v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 Fp[2] FC5 Fp} vd v47 v48 v49 v50 v51 v52 Fp Fi FC8 FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC17{ BC18{ BC19{ vd v57 v58 v59 v60 v61 v62 v63 v64 v65 v66 Fp[2] FC5 Fp} vd v67 v68 v69 v70 v71 v72 Fp Fi FC20{ m Fp Fi FC21{ m} FC21} FC12 Fi} vd v53 v54 v55 v56 FC22{ m FC13} FC22 Fi[6] FC23{ m FC24{ m FL}} FC23 Fc[7] Fi[2] FC12 FC12 FC12 FC12 FC12 Fc[7]} FC14 FC14 Fp Fi[2]}


 S1489C1 ::~S1489C1(){ note_dtor("S1489C1", this);}
void  S1489C1 ::v1(){vfunc_called(this, "_ZN7S1489C12v1Ev");}
void  S1489C1 ::v2(){vfunc_called(this, "_ZN7S1489C12v2Ev");}
void  S1489C1 ::v3(){vfunc_called(this, "_ZN7S1489C12v3Ev");}
void  S1489C1 ::v4(){vfunc_called(this, "_ZN7S1489C12v4Ev");}
S1489C1 ::S1489C1(){ note_ctor("S1489C1", this);} // tgen

static void Test_S1489C1()
{
  extern Class_Descriptor cd_S1489C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(169,260)];
    init_test(&cd_S1489C1, buf);
    S1489C1 *dp, &lv = *(dp=new (buf) S1489C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1344,1036), "sizeof(S1489C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1489C1)");
    check_base_class_offset(lv, (S1489C4*)(S1489C3*)(S1489C2*), 0, "S1489C1");
    check_base_class_offset(lv, (S1489C3*)(S1489C2*), 0, "S1489C1");
    check_base_class_offset(lv, (S1489C2*), 0, "S1489C1");
    check_field_offset(lv, s1489c1f0, ABISELECT(152,104), "S1489C1.s1489c1f0");
    check_field_offset(lv, s1489c1f1, ABISELECT(448,328), "S1489C1.s1489c1f1");
    check_field_offset(lv, s1489c1f2, ABISELECT(736,576), "S1489C1.s1489c1f2");
    check_field_offset(lv, s1489c1f3, ABISELECT(1032,800), "S1489C1.s1489c1f3");
    check_field_offset(lv, s1489c1f4, ABISELECT(1328,1024), "S1489C1.s1489c1f4");
    check_field_offset(lv, s1489c1f5, ABISELECT(1336,1028), "S1489C1.s1489c1f5");
    test_class_info(&lv, &cd_S1489C1);
    dp->~S1489C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1489C1(Test_S1489C1, "S1489C1", ABISELECT(1344,1036));

#else // __cplusplus

extern void _ZN7S1489C1C1Ev();
extern void _ZN7S1489C1D1Ev();
Name_Map name_map_S1489C1[] = {
  NSPAIR(_ZN7S1489C1C1Ev),
  NSPAIR(_ZN7S1489C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1489C4;
extern VTBL_ENTRY _ZTI7S1489C4[];
extern  VTBL_ENTRY _ZTV7S1489C4[];
extern Class_Descriptor cd_S1489C3;
extern VTBL_ENTRY _ZTI7S1489C3[];
extern  VTBL_ENTRY _ZTV7S1489C3[];
extern Class_Descriptor cd_S1489C2;
extern VTBL_ENTRY _ZTI7S1489C2[];
extern  VTBL_ENTRY _ZTV7S1489C2[];
static Base_Class bases_S1489C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1489C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1489C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1489C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1489C1[];
extern void _ZN7S1489C1D1Ev();
extern void _ZN7S1489C1D0Ev();
extern void _ZN7S1489C42v5Ev();
extern void _ZN7S1489C42v6Ev();
extern void _ZN7S1489C42v7Ev();
extern void _ZN7S1489C42v8Ev();
extern void _ZN7S1489C42v9Ev();
extern void _ZN7S1489C43v10Ev();
extern void _ZN7S1489C43v11Ev();
extern void _ZN7S1489C43v12Ev();
extern void _ZN7S1489C43v13Ev();
extern void _ZN7S1489C43v14Ev();
extern void _ZN7S1489C33v15Ev();
extern void _ZN7S1489C33v16Ev();
extern void _ZN7S1489C33v17Ev();
extern void _ZN7S1489C33v18Ev();
extern void _ZN7S1489C33v19Ev();
extern void _ZN7S1489C33v20Ev();
extern void _ZN7S1489C33v21Ev();
extern void _ZN7S1489C33v22Ev();
extern void _ZN7S1489C33v23Ev();
extern void _ZN7S1489C33v24Ev();
extern void _ZN7S1489C33v25Ev();
extern void _ZN7S1489C33v26Ev();
extern void _ZN7S1489C33v27Ev();
extern void _ZN7S1489C33v28Ev();
extern void _ZN7S1489C23v29Ev();
extern void _ZN7S1489C23v30Ev();
extern void _ZN7S1489C23v31Ev();
extern void _ZN7S1489C23v32Ev();
extern void _ZN7S1489C12v1Ev();
extern void _ZN7S1489C12v2Ev();
extern void _ZN7S1489C12v3Ev();
extern void _ZN7S1489C12v4Ev();
static  VTBL_ENTRY vtc_S1489C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1489C1[0]),
  (VTBL_ENTRY)&_ZN7S1489C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1489C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1489C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1489C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1489C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1489C23v32Ev,
  (VTBL_ENTRY)&_ZN7S1489C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1489C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1489C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1489C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1489C1[];
extern  VTBL_ENTRY _ZTV7S1489C1[];
Class_Descriptor cd_S1489C1 = {  "S1489C1", // class name
  bases_S1489C1, 3,
  &(vtc_S1489C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1344,1036), // object size
  NSPAIRA(_ZTI7S1489C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1489C1),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1388C4  {
  void *s1388c4f0[2];
  ::S10103C13_nt s1388c4f1;
  void *s1388c4f2;
  virtual  ~S1388C4(); // _ZN7S1388C4D1Ev
  virtual void  v3(); // _ZN7S1388C42v3Ev
  virtual void  v4(); // _ZN7S1388C42v4Ev
  virtual void  v5(); // _ZN7S1388C42v5Ev
  virtual void  v6(); // _ZN7S1388C42v6Ev
  virtual void  v7(); // _ZN7S1388C42v7Ev
  virtual void  v8(); // _ZN7S1388C42v8Ev
  virtual void  v9(); // _ZN7S1388C42v9Ev
  virtual void  v10(); // _ZN7S1388C43v10Ev
  virtual void  v11(); // _ZN7S1388C43v11Ev
  virtual void  v12(); // _ZN7S1388C43v12Ev
  S1388C4(); // tgen
};
//SIG(-1 S1388C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1388C4 ::~S1388C4(){ note_dtor("S1388C4", this);}
void  S1388C4 ::v3(){vfunc_called(this, "_ZN7S1388C42v3Ev");}
void  S1388C4 ::v4(){vfunc_called(this, "_ZN7S1388C42v4Ev");}
void  S1388C4 ::v5(){vfunc_called(this, "_ZN7S1388C42v5Ev");}
void  S1388C4 ::v6(){vfunc_called(this, "_ZN7S1388C42v6Ev");}
void  S1388C4 ::v7(){vfunc_called(this, "_ZN7S1388C42v7Ev");}
void  S1388C4 ::v8(){vfunc_called(this, "_ZN7S1388C42v8Ev");}
void  S1388C4 ::v9(){vfunc_called(this, "_ZN7S1388C42v9Ev");}
void  S1388C4 ::v10(){vfunc_called(this, "_ZN7S1388C43v10Ev");}
void  S1388C4 ::v11(){vfunc_called(this, "_ZN7S1388C43v11Ev");}
void  S1388C4 ::v12(){vfunc_called(this, "_ZN7S1388C43v12Ev");}
S1388C4 ::S1388C4(){ note_ctor("S1388C4", this);} // tgen

static void Test_S1388C4()
{
  extern Class_Descriptor cd_S1388C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1388C4, buf);
    S1388C4 *dp, &lv = *(dp=new (buf) S1388C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1388C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1388C4)");
    check_field_offset(lv, s1388c4f0, ABISELECT(8,4), "S1388C4.s1388c4f0");
    check_field_offset(lv, s1388c4f1, ABISELECT(24,12), "S1388C4.s1388c4f1");
    check_field_offset(lv, s1388c4f2, ABISELECT(48,28), "S1388C4.s1388c4f2");
    test_class_info(&lv, &cd_S1388C4);
    dp->~S1388C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1388C4(Test_S1388C4, "S1388C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1388C4C1Ev();
extern void _ZN7S1388C4D1Ev();
Name_Map name_map_S1388C4[] = {
  NSPAIR(_ZN7S1388C4C1Ev),
  NSPAIR(_ZN7S1388C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1388C4[];
extern void _ZN7S1388C4D1Ev();
extern void _ZN7S1388C4D0Ev();
extern void _ZN7S1388C42v3Ev();
extern void _ZN7S1388C42v4Ev();
extern void _ZN7S1388C42v5Ev();
extern void _ZN7S1388C42v6Ev();
extern void _ZN7S1388C42v7Ev();
extern void _ZN7S1388C42v8Ev();
extern void _ZN7S1388C42v9Ev();
extern void _ZN7S1388C43v10Ev();
extern void _ZN7S1388C43v11Ev();
extern void _ZN7S1388C43v12Ev();
static  VTBL_ENTRY vtc_S1388C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1388C4[0]),
  (VTBL_ENTRY)&_ZN7S1388C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1388C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v12Ev,
};
extern VTBL_ENTRY _ZTI7S1388C4[];
extern  VTBL_ENTRY _ZTV7S1388C4[];
Class_Descriptor cd_S1388C4 = {  "S1388C4", // class name
  0,0,//no base classes
  &(vtc_S1388C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1388C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1388C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1388C3  : S1388C4 {
  ::S10103C86 s1388c3f0;
  ::S10103C106 s1388c3f1;
  ::S10103C82_nt s1388c3f2;
  ::S10103C13_nt s1388c3f3;
  virtual  ~S1388C3(); // _ZN7S1388C3D1Ev
  virtual void  v13(); // _ZN7S1388C33v13Ev
  virtual void  v14(); // _ZN7S1388C33v14Ev
  virtual void  v15(); // _ZN7S1388C33v15Ev
  virtual void  v16(); // _ZN7S1388C33v16Ev
  virtual void  v17(); // _ZN7S1388C33v17Ev
  virtual void  v18(); // _ZN7S1388C33v18Ev
  virtual void  v19(); // _ZN7S1388C33v19Ev
  virtual void  v20(); // _ZN7S1388C33v20Ev
  virtual void  v21(); // _ZN7S1388C33v21Ev
  virtual void  v22(); // _ZN7S1388C33v22Ev
  virtual void  v23(); // _ZN7S1388C33v23Ev
  virtual void  v24(); // _ZN7S1388C33v24Ev
  virtual void  v25(); // _ZN7S1388C33v25Ev
  virtual void  v26(); // _ZN7S1388C33v26Ev
  S1388C3(); // tgen
};
//SIG(-1 S1388C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1388C3 ::~S1388C3(){ note_dtor("S1388C3", this);}
void  S1388C3 ::v13(){vfunc_called(this, "_ZN7S1388C33v13Ev");}
void  S1388C3 ::v14(){vfunc_called(this, "_ZN7S1388C33v14Ev");}
void  S1388C3 ::v15(){vfunc_called(this, "_ZN7S1388C33v15Ev");}
void  S1388C3 ::v16(){vfunc_called(this, "_ZN7S1388C33v16Ev");}
void  S1388C3 ::v17(){vfunc_called(this, "_ZN7S1388C33v17Ev");}
void  S1388C3 ::v18(){vfunc_called(this, "_ZN7S1388C33v18Ev");}
void  S1388C3 ::v19(){vfunc_called(this, "_ZN7S1388C33v19Ev");}
void  S1388C3 ::v20(){vfunc_called(this, "_ZN7S1388C33v20Ev");}
void  S1388C3 ::v21(){vfunc_called(this, "_ZN7S1388C33v21Ev");}
void  S1388C3 ::v22(){vfunc_called(this, "_ZN7S1388C33v22Ev");}
void  S1388C3 ::v23(){vfunc_called(this, "_ZN7S1388C33v23Ev");}
void  S1388C3 ::v24(){vfunc_called(this, "_ZN7S1388C33v24Ev");}
void  S1388C3 ::v25(){vfunc_called(this, "_ZN7S1388C33v25Ev");}
void  S1388C3 ::v26(){vfunc_called(this, "_ZN7S1388C33v26Ev");}
S1388C3 ::S1388C3(){ note_ctor("S1388C3", this);} // tgen

static void Test_S1388C3()
{
  extern Class_Descriptor cd_S1388C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1388C3, buf);
    S1388C3 *dp, &lv = *(dp=new (buf) S1388C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1388C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1388C3)");
    check_base_class_offset(lv, (S1388C4*), 0, "S1388C3");
    check_field_offset(lv, s1388c3f0, ABISELECT(56,32), "S1388C3.s1388c3f0");
    check_field_offset(lv, s1388c3f1, ABISELECT(72,44), "S1388C3.s1388c3f1");
    check_field_offset(lv, s1388c3f2, ABISELECT(96,60), "S1388C3.s1388c3f2");
    check_field_offset(lv, s1388c3f3, ABISELECT(112,76), "S1388C3.s1388c3f3");
    test_class_info(&lv, &cd_S1388C3);
    dp->~S1388C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1388C3(Test_S1388C3, "S1388C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1388C3C1Ev();
extern void _ZN7S1388C3D1Ev();
Name_Map name_map_S1388C3[] = {
  NSPAIR(_ZN7S1388C3C1Ev),
  NSPAIR(_ZN7S1388C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1388C4;
extern VTBL_ENTRY _ZTI7S1388C4[];
extern  VTBL_ENTRY _ZTV7S1388C4[];
static Base_Class bases_S1388C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1388C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1388C3[];
extern void _ZN7S1388C3D1Ev();
extern void _ZN7S1388C3D0Ev();
extern void _ZN7S1388C42v3Ev();
extern void _ZN7S1388C42v4Ev();
extern void _ZN7S1388C42v5Ev();
extern void _ZN7S1388C42v6Ev();
extern void _ZN7S1388C42v7Ev();
extern void _ZN7S1388C42v8Ev();
extern void _ZN7S1388C42v9Ev();
extern void _ZN7S1388C43v10Ev();
extern void _ZN7S1388C43v11Ev();
extern void _ZN7S1388C43v12Ev();
extern void _ZN7S1388C33v13Ev();
extern void _ZN7S1388C33v14Ev();
extern void _ZN7S1388C33v15Ev();
extern void _ZN7S1388C33v16Ev();
extern void _ZN7S1388C33v17Ev();
extern void _ZN7S1388C33v18Ev();
extern void _ZN7S1388C33v19Ev();
extern void _ZN7S1388C33v20Ev();
extern void _ZN7S1388C33v21Ev();
extern void _ZN7S1388C33v22Ev();
extern void _ZN7S1388C33v23Ev();
extern void _ZN7S1388C33v24Ev();
extern void _ZN7S1388C33v25Ev();
extern void _ZN7S1388C33v26Ev();
static  VTBL_ENTRY vtc_S1388C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1388C3[0]),
  (VTBL_ENTRY)&_ZN7S1388C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1388C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v26Ev,
};
extern VTBL_ENTRY _ZTI7S1388C3[];
extern  VTBL_ENTRY _ZTV7S1388C3[];
Class_Descriptor cd_S1388C3 = {  "S1388C3", // class name
  bases_S1388C3, 1,
  &(vtc_S1388C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1388C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1388C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1388C2  : S1388C3 {
  ::S10103C84 s1388c2f0;
  ::S679C23 s1388c2f1;
  void *s1388c2f2;
  virtual  ~S1388C2(); // _ZN7S1388C2D1Ev
  virtual void  v27(); // _ZN7S1388C23v27Ev
  virtual void  v28(); // _ZN7S1388C23v28Ev
  virtual void  v29(); // _ZN7S1388C23v29Ev
  virtual void  v30(); // _ZN7S1388C23v30Ev
  S1388C2(); // tgen
};
//SIG(-1 S1388C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]} FC16{ BC17{ BC18{ vd v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 Fp[2] FC4 Fp} vd v63 v64 v65 v66 v67 v68 Fp Fi FC19{ m Fp Fi FC20{ m} FC20} FC11 Fi} vd v49 v50 v51 v52 FC21{ m FC12} FC21 Fi[6] FC22{ m FC23{ m FL}} FC22 Fc[7] Fi[2] FC11 FC11 FC11 FC11 FC11 Fc[7]} Fp}


 S1388C2 ::~S1388C2(){ note_dtor("S1388C2", this);}
void  S1388C2 ::v27(){vfunc_called(this, "_ZN7S1388C23v27Ev");}
void  S1388C2 ::v28(){vfunc_called(this, "_ZN7S1388C23v28Ev");}
void  S1388C2 ::v29(){vfunc_called(this, "_ZN7S1388C23v29Ev");}
void  S1388C2 ::v30(){vfunc_called(this, "_ZN7S1388C23v30Ev");}
S1388C2 ::S1388C2(){ note_ctor("S1388C2", this);} // tgen

static void Test_S1388C2()
{
  extern Class_Descriptor cd_S1388C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(92,143)];
    init_test(&cd_S1388C2, buf);
    S1388C2 *dp, &lv = *(dp=new (buf) S1388C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(728,568), "sizeof(S1388C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1388C2)");
    check_base_class_offset(lv, (S1388C4*)(S1388C3*), 0, "S1388C2");
    check_base_class_offset(lv, (S1388C3*), 0, "S1388C2");
    check_field_offset(lv, s1388c2f0, ABISELECT(136,92), "S1388C2.s1388c2f0");
    check_field_offset(lv, s1388c2f1, ABISELECT(432,316), "S1388C2.s1388c2f1");
    check_field_offset(lv, s1388c2f2, ABISELECT(720,564), "S1388C2.s1388c2f2");
    test_class_info(&lv, &cd_S1388C2);
    dp->~S1388C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1388C2(Test_S1388C2, "S1388C2", ABISELECT(728,568));

#else // __cplusplus

extern void _ZN7S1388C2C1Ev();
extern void _ZN7S1388C2D1Ev();
Name_Map name_map_S1388C2[] = {
  NSPAIR(_ZN7S1388C2C1Ev),
  NSPAIR(_ZN7S1388C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1388C4;
extern VTBL_ENTRY _ZTI7S1388C4[];
extern  VTBL_ENTRY _ZTV7S1388C4[];
extern Class_Descriptor cd_S1388C3;
extern VTBL_ENTRY _ZTI7S1388C3[];
extern  VTBL_ENTRY _ZTV7S1388C3[];
static Base_Class bases_S1388C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1388C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1388C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1388C2[];
extern void _ZN7S1388C2D1Ev();
extern void _ZN7S1388C2D0Ev();
extern void _ZN7S1388C42v3Ev();
extern void _ZN7S1388C42v4Ev();
extern void _ZN7S1388C42v5Ev();
extern void _ZN7S1388C42v6Ev();
extern void _ZN7S1388C42v7Ev();
extern void _ZN7S1388C42v8Ev();
extern void _ZN7S1388C42v9Ev();
extern void _ZN7S1388C43v10Ev();
extern void _ZN7S1388C43v11Ev();
extern void _ZN7S1388C43v12Ev();
extern void _ZN7S1388C33v13Ev();
extern void _ZN7S1388C33v14Ev();
extern void _ZN7S1388C33v15Ev();
extern void _ZN7S1388C33v16Ev();
extern void _ZN7S1388C33v17Ev();
extern void _ZN7S1388C33v18Ev();
extern void _ZN7S1388C33v19Ev();
extern void _ZN7S1388C33v20Ev();
extern void _ZN7S1388C33v21Ev();
extern void _ZN7S1388C33v22Ev();
extern void _ZN7S1388C33v23Ev();
extern void _ZN7S1388C33v24Ev();
extern void _ZN7S1388C33v25Ev();
extern void _ZN7S1388C33v26Ev();
extern void _ZN7S1388C23v27Ev();
extern void _ZN7S1388C23v28Ev();
extern void _ZN7S1388C23v29Ev();
extern void _ZN7S1388C23v30Ev();
static  VTBL_ENTRY vtc_S1388C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1388C2[0]),
  (VTBL_ENTRY)&_ZN7S1388C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1388C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v30Ev,
};
extern VTBL_ENTRY _ZTI7S1388C2[];
extern  VTBL_ENTRY _ZTV7S1388C2[];
Class_Descriptor cd_S1388C2 = {  "S1388C2", // class name
  bases_S1388C2, 2,
  &(vtc_S1388C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(728,568), // object size
  NSPAIRA(_ZTI7S1388C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1388C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1388C1  : S1388C2 {
  ::S10103C84 s1388c1f0;
  virtual  ~S1388C1(); // _ZN7S1388C1D1Ev
  virtual void  v1(); // _ZN7S1388C12v1Ev
  virtual void  v2(); // _ZN7S1388C12v2Ev
  S1388C1(); // tgen
};
//SIG(1 S1388C1) C1{ BC2{ BC3{ BC4{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} vd v27 v28 v29 v30 FC14{ BC15{ BC16{ vd v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 Fp[2] FC5 Fp} vd v45 v46 v47 v48 v49 v50 Fp Fi FC8 FC12 Fi} vd v31 v32 v33 v34 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC17{ BC18{ BC19{ vd v55 v56 v57 v58 v59 v60 v61 v62 v63 v64 Fp[2] FC5 Fp} vd v65 v66 v67 v68 v69 v70 Fp Fi FC20{ m Fp Fi FC21{ m} FC21} FC12 Fi} vd v51 v52 v53 v54 FC22{ m FC13} FC22 Fi[6] FC23{ m FC24{ m FL}} FC23 Fc[7] Fi[2] FC12 FC12 FC12 FC12 FC12 Fc[7]} Fp} vd v1 v2 FC14}


 S1388C1 ::~S1388C1(){ note_dtor("S1388C1", this);}
void  S1388C1 ::v1(){vfunc_called(this, "_ZN7S1388C12v1Ev");}
void  S1388C1 ::v2(){vfunc_called(this, "_ZN7S1388C12v2Ev");}
S1388C1 ::S1388C1(){ note_ctor("S1388C1", this);} // tgen

static void Test_S1388C1()
{
  extern Class_Descriptor cd_S1388C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(129,199)];
    init_test(&cd_S1388C1, buf);
    S1388C1 *dp, &lv = *(dp=new (buf) S1388C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1024,792), "sizeof(S1388C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1388C1)");
    check_base_class_offset(lv, (S1388C4*)(S1388C3*)(S1388C2*), 0, "S1388C1");
    check_base_class_offset(lv, (S1388C3*)(S1388C2*), 0, "S1388C1");
    check_base_class_offset(lv, (S1388C2*), 0, "S1388C1");
    check_field_offset(lv, s1388c1f0, ABISELECT(728,568), "S1388C1.s1388c1f0");
    test_class_info(&lv, &cd_S1388C1);
    dp->~S1388C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1388C1(Test_S1388C1, "S1388C1", ABISELECT(1024,792));

#else // __cplusplus

extern void _ZN7S1388C1C1Ev();
extern void _ZN7S1388C1D1Ev();
Name_Map name_map_S1388C1[] = {
  NSPAIR(_ZN7S1388C1C1Ev),
  NSPAIR(_ZN7S1388C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1388C4;
extern VTBL_ENTRY _ZTI7S1388C4[];
extern  VTBL_ENTRY _ZTV7S1388C4[];
extern Class_Descriptor cd_S1388C3;
extern VTBL_ENTRY _ZTI7S1388C3[];
extern  VTBL_ENTRY _ZTV7S1388C3[];
extern Class_Descriptor cd_S1388C2;
extern VTBL_ENTRY _ZTI7S1388C2[];
extern  VTBL_ENTRY _ZTV7S1388C2[];
static Base_Class bases_S1388C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1388C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1388C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1388C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1388C1[];
extern void _ZN7S1388C1D1Ev();
extern void _ZN7S1388C1D0Ev();
extern void _ZN7S1388C42v3Ev();
extern void _ZN7S1388C42v4Ev();
extern void _ZN7S1388C42v5Ev();
extern void _ZN7S1388C42v6Ev();
extern void _ZN7S1388C42v7Ev();
extern void _ZN7S1388C42v8Ev();
extern void _ZN7S1388C42v9Ev();
extern void _ZN7S1388C43v10Ev();
extern void _ZN7S1388C43v11Ev();
extern void _ZN7S1388C43v12Ev();
extern void _ZN7S1388C33v13Ev();
extern void _ZN7S1388C33v14Ev();
extern void _ZN7S1388C33v15Ev();
extern void _ZN7S1388C33v16Ev();
extern void _ZN7S1388C33v17Ev();
extern void _ZN7S1388C33v18Ev();
extern void _ZN7S1388C33v19Ev();
extern void _ZN7S1388C33v20Ev();
extern void _ZN7S1388C33v21Ev();
extern void _ZN7S1388C33v22Ev();
extern void _ZN7S1388C33v23Ev();
extern void _ZN7S1388C33v24Ev();
extern void _ZN7S1388C33v25Ev();
extern void _ZN7S1388C33v26Ev();
extern void _ZN7S1388C23v27Ev();
extern void _ZN7S1388C23v28Ev();
extern void _ZN7S1388C23v29Ev();
extern void _ZN7S1388C23v30Ev();
extern void _ZN7S1388C12v1Ev();
extern void _ZN7S1388C12v2Ev();
static  VTBL_ENTRY vtc_S1388C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1388C1[0]),
  (VTBL_ENTRY)&_ZN7S1388C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1388C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1388C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1388C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1388C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1388C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1388C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1388C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S1388C1[];
extern  VTBL_ENTRY _ZTV7S1388C1[];
Class_Descriptor cd_S1388C1 = {  "S1388C1", // class name
  bases_S1388C1, 3,
  &(vtc_S1388C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1024,792), // object size
  NSPAIRA(_ZTI7S1388C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1388C1),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1491C4  {
  void *s1491c4f0[2];
  ::S10103C13_nt s1491c4f1;
  void *s1491c4f2;
  virtual  ~S1491C4(); // _ZN7S1491C4D1Ev
  virtual void  v5(); // _ZN7S1491C42v5Ev
  virtual void  v6(); // _ZN7S1491C42v6Ev
  virtual void  v7(); // _ZN7S1491C42v7Ev
  virtual void  v8(); // _ZN7S1491C42v8Ev
  virtual void  v9(); // _ZN7S1491C42v9Ev
  virtual void  v10(); // _ZN7S1491C43v10Ev
  virtual void  v11(); // _ZN7S1491C43v11Ev
  virtual void  v12(); // _ZN7S1491C43v12Ev
  virtual void  v13(); // _ZN7S1491C43v13Ev
  virtual void  v14(); // _ZN7S1491C43v14Ev
  S1491C4(); // tgen
};
//SIG(-1 S1491C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1491C4 ::~S1491C4(){ note_dtor("S1491C4", this);}
void  S1491C4 ::v5(){vfunc_called(this, "_ZN7S1491C42v5Ev");}
void  S1491C4 ::v6(){vfunc_called(this, "_ZN7S1491C42v6Ev");}
void  S1491C4 ::v7(){vfunc_called(this, "_ZN7S1491C42v7Ev");}
void  S1491C4 ::v8(){vfunc_called(this, "_ZN7S1491C42v8Ev");}
void  S1491C4 ::v9(){vfunc_called(this, "_ZN7S1491C42v9Ev");}
void  S1491C4 ::v10(){vfunc_called(this, "_ZN7S1491C43v10Ev");}
void  S1491C4 ::v11(){vfunc_called(this, "_ZN7S1491C43v11Ev");}
void  S1491C4 ::v12(){vfunc_called(this, "_ZN7S1491C43v12Ev");}
void  S1491C4 ::v13(){vfunc_called(this, "_ZN7S1491C43v13Ev");}
void  S1491C4 ::v14(){vfunc_called(this, "_ZN7S1491C43v14Ev");}
S1491C4 ::S1491C4(){ note_ctor("S1491C4", this);} // tgen

static void Test_S1491C4()
{
  extern Class_Descriptor cd_S1491C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1491C4, buf);
    S1491C4 *dp, &lv = *(dp=new (buf) S1491C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1491C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1491C4)");
    check_field_offset(lv, s1491c4f0, ABISELECT(8,4), "S1491C4.s1491c4f0");
    check_field_offset(lv, s1491c4f1, ABISELECT(24,12), "S1491C4.s1491c4f1");
    check_field_offset(lv, s1491c4f2, ABISELECT(48,28), "S1491C4.s1491c4f2");
    test_class_info(&lv, &cd_S1491C4);
    dp->~S1491C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1491C4(Test_S1491C4, "S1491C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1491C4C1Ev();
extern void _ZN7S1491C4D1Ev();
Name_Map name_map_S1491C4[] = {
  NSPAIR(_ZN7S1491C4C1Ev),
  NSPAIR(_ZN7S1491C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1491C4[];
extern void _ZN7S1491C4D1Ev();
extern void _ZN7S1491C4D0Ev();
extern void _ZN7S1491C42v5Ev();
extern void _ZN7S1491C42v6Ev();
extern void _ZN7S1491C42v7Ev();
extern void _ZN7S1491C42v8Ev();
extern void _ZN7S1491C42v9Ev();
extern void _ZN7S1491C43v10Ev();
extern void _ZN7S1491C43v11Ev();
extern void _ZN7S1491C43v12Ev();
extern void _ZN7S1491C43v13Ev();
extern void _ZN7S1491C43v14Ev();
static  VTBL_ENTRY vtc_S1491C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1491C4[0]),
  (VTBL_ENTRY)&_ZN7S1491C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1491C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1491C4[];
extern  VTBL_ENTRY _ZTV7S1491C4[];
Class_Descriptor cd_S1491C4 = {  "S1491C4", // class name
  0,0,//no base classes
  &(vtc_S1491C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1491C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1491C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1491C3  : S1491C4 {
  ::S10103C86 s1491c3f0;
  ::S10103C106 s1491c3f1;
  ::S10103C82_nt s1491c3f2;
  ::S10103C13_nt s1491c3f3;
  virtual  ~S1491C3(); // _ZN7S1491C3D1Ev
  virtual void  v15(); // _ZN7S1491C33v15Ev
  virtual void  v16(); // _ZN7S1491C33v16Ev
  virtual void  v17(); // _ZN7S1491C33v17Ev
  virtual void  v18(); // _ZN7S1491C33v18Ev
  virtual void  v19(); // _ZN7S1491C33v19Ev
  virtual void  v20(); // _ZN7S1491C33v20Ev
  virtual void  v21(); // _ZN7S1491C33v21Ev
  virtual void  v22(); // _ZN7S1491C33v22Ev
  virtual void  v23(); // _ZN7S1491C33v23Ev
  virtual void  v24(); // _ZN7S1491C33v24Ev
  virtual void  v25(); // _ZN7S1491C33v25Ev
  virtual void  v26(); // _ZN7S1491C33v26Ev
  virtual void  v27(); // _ZN7S1491C33v27Ev
  virtual void  v28(); // _ZN7S1491C33v28Ev
  S1491C3(); // tgen
};
//SIG(-1 S1491C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1491C3 ::~S1491C3(){ note_dtor("S1491C3", this);}
void  S1491C3 ::v15(){vfunc_called(this, "_ZN7S1491C33v15Ev");}
void  S1491C3 ::v16(){vfunc_called(this, "_ZN7S1491C33v16Ev");}
void  S1491C3 ::v17(){vfunc_called(this, "_ZN7S1491C33v17Ev");}
void  S1491C3 ::v18(){vfunc_called(this, "_ZN7S1491C33v18Ev");}
void  S1491C3 ::v19(){vfunc_called(this, "_ZN7S1491C33v19Ev");}
void  S1491C3 ::v20(){vfunc_called(this, "_ZN7S1491C33v20Ev");}
void  S1491C3 ::v21(){vfunc_called(this, "_ZN7S1491C33v21Ev");}
void  S1491C3 ::v22(){vfunc_called(this, "_ZN7S1491C33v22Ev");}
void  S1491C3 ::v23(){vfunc_called(this, "_ZN7S1491C33v23Ev");}
void  S1491C3 ::v24(){vfunc_called(this, "_ZN7S1491C33v24Ev");}
void  S1491C3 ::v25(){vfunc_called(this, "_ZN7S1491C33v25Ev");}
void  S1491C3 ::v26(){vfunc_called(this, "_ZN7S1491C33v26Ev");}
void  S1491C3 ::v27(){vfunc_called(this, "_ZN7S1491C33v27Ev");}
void  S1491C3 ::v28(){vfunc_called(this, "_ZN7S1491C33v28Ev");}
S1491C3 ::S1491C3(){ note_ctor("S1491C3", this);} // tgen

static void Test_S1491C3()
{
  extern Class_Descriptor cd_S1491C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1491C3, buf);
    S1491C3 *dp, &lv = *(dp=new (buf) S1491C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1491C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1491C3)");
    check_base_class_offset(lv, (S1491C4*), 0, "S1491C3");
    check_field_offset(lv, s1491c3f0, ABISELECT(56,32), "S1491C3.s1491c3f0");
    check_field_offset(lv, s1491c3f1, ABISELECT(72,44), "S1491C3.s1491c3f1");
    check_field_offset(lv, s1491c3f2, ABISELECT(96,60), "S1491C3.s1491c3f2");
    check_field_offset(lv, s1491c3f3, ABISELECT(112,76), "S1491C3.s1491c3f3");
    test_class_info(&lv, &cd_S1491C3);
    dp->~S1491C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1491C3(Test_S1491C3, "S1491C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1491C3C1Ev();
extern void _ZN7S1491C3D1Ev();
Name_Map name_map_S1491C3[] = {
  NSPAIR(_ZN7S1491C3C1Ev),
  NSPAIR(_ZN7S1491C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1491C4;
extern VTBL_ENTRY _ZTI7S1491C4[];
extern  VTBL_ENTRY _ZTV7S1491C4[];
static Base_Class bases_S1491C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1491C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1491C3[];
extern void _ZN7S1491C3D1Ev();
extern void _ZN7S1491C3D0Ev();
extern void _ZN7S1491C42v5Ev();
extern void _ZN7S1491C42v6Ev();
extern void _ZN7S1491C42v7Ev();
extern void _ZN7S1491C42v8Ev();
extern void _ZN7S1491C42v9Ev();
extern void _ZN7S1491C43v10Ev();
extern void _ZN7S1491C43v11Ev();
extern void _ZN7S1491C43v12Ev();
extern void _ZN7S1491C43v13Ev();
extern void _ZN7S1491C43v14Ev();
extern void _ZN7S1491C33v15Ev();
extern void _ZN7S1491C33v16Ev();
extern void _ZN7S1491C33v17Ev();
extern void _ZN7S1491C33v18Ev();
extern void _ZN7S1491C33v19Ev();
extern void _ZN7S1491C33v20Ev();
extern void _ZN7S1491C33v21Ev();
extern void _ZN7S1491C33v22Ev();
extern void _ZN7S1491C33v23Ev();
extern void _ZN7S1491C33v24Ev();
extern void _ZN7S1491C33v25Ev();
extern void _ZN7S1491C33v26Ev();
extern void _ZN7S1491C33v27Ev();
extern void _ZN7S1491C33v28Ev();
static  VTBL_ENTRY vtc_S1491C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1491C3[0]),
  (VTBL_ENTRY)&_ZN7S1491C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1491C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v28Ev,
};
extern VTBL_ENTRY _ZTI7S1491C3[];
extern  VTBL_ENTRY _ZTV7S1491C3[];
Class_Descriptor cd_S1491C3 = {  "S1491C3", // class name
  bases_S1491C3, 1,
  &(vtc_S1491C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1491C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1491C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1491C2  : S1491C3 {
  virtual  ~S1491C2(); // _ZN7S1491C2D1Ev
  virtual void  v29(); // _ZN7S1491C23v29Ev
  S1491C2(); // tgen
};
//SIG(-1 S1491C2) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1}


 S1491C2 ::~S1491C2(){ note_dtor("S1491C2", this);}
void  S1491C2 ::v29(){vfunc_called(this, "_ZN7S1491C23v29Ev");}
S1491C2 ::S1491C2(){ note_ctor("S1491C2", this);} // tgen

static void Test_S1491C2()
{
  extern Class_Descriptor cd_S1491C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1491C2, buf);
    S1491C2 *dp, &lv = *(dp=new (buf) S1491C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1491C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1491C2)");
    check_base_class_offset(lv, (S1491C4*)(S1491C3*), 0, "S1491C2");
    check_base_class_offset(lv, (S1491C3*), 0, "S1491C2");
    test_class_info(&lv, &cd_S1491C2);
    dp->~S1491C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1491C2(Test_S1491C2, "S1491C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1491C2C1Ev();
extern void _ZN7S1491C2D1Ev();
Name_Map name_map_S1491C2[] = {
  NSPAIR(_ZN7S1491C2C1Ev),
  NSPAIR(_ZN7S1491C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1491C4;
extern VTBL_ENTRY _ZTI7S1491C4[];
extern  VTBL_ENTRY _ZTV7S1491C4[];
extern Class_Descriptor cd_S1491C3;
extern VTBL_ENTRY _ZTI7S1491C3[];
extern  VTBL_ENTRY _ZTV7S1491C3[];
static Base_Class bases_S1491C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1491C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1491C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1491C2[];
extern void _ZN7S1491C2D1Ev();
extern void _ZN7S1491C2D0Ev();
extern void _ZN7S1491C42v5Ev();
extern void _ZN7S1491C42v6Ev();
extern void _ZN7S1491C42v7Ev();
extern void _ZN7S1491C42v8Ev();
extern void _ZN7S1491C42v9Ev();
extern void _ZN7S1491C43v10Ev();
extern void _ZN7S1491C43v11Ev();
extern void _ZN7S1491C43v12Ev();
extern void _ZN7S1491C43v13Ev();
extern void _ZN7S1491C43v14Ev();
extern void _ZN7S1491C33v15Ev();
extern void _ZN7S1491C33v16Ev();
extern void _ZN7S1491C33v17Ev();
extern void _ZN7S1491C33v18Ev();
extern void _ZN7S1491C33v19Ev();
extern void _ZN7S1491C33v20Ev();
extern void _ZN7S1491C33v21Ev();
extern void _ZN7S1491C33v22Ev();
extern void _ZN7S1491C33v23Ev();
extern void _ZN7S1491C33v24Ev();
extern void _ZN7S1491C33v25Ev();
extern void _ZN7S1491C33v26Ev();
extern void _ZN7S1491C33v27Ev();
extern void _ZN7S1491C33v28Ev();
extern void _ZN7S1491C23v29Ev();
static  VTBL_ENTRY vtc_S1491C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1491C2[0]),
  (VTBL_ENTRY)&_ZN7S1491C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1491C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1491C23v29Ev,
};
extern VTBL_ENTRY _ZTI7S1491C2[];
extern  VTBL_ENTRY _ZTV7S1491C2[];
Class_Descriptor cd_S1491C2 = {  "S1491C2", // class name
  bases_S1491C2, 2,
  &(vtc_S1491C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1491C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1491C2),29, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1491C1  : S1491C2 {
  ::S10103C84 s1491c1f0;
  ::S679C23 s1491c1f1;
  virtual  ~S1491C1(); // _ZN7S1491C1D1Ev
  virtual void  v1(); // _ZN7S1491C12v1Ev
  virtual void  v2(); // _ZN7S1491C12v2Ev
  virtual void  v3(); // _ZN7S1491C12v3Ev
  virtual void  v4(); // _ZN7S1491C12v4Ev
  S1491C1(); // tgen
};
//SIG(1 S1491C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} vd v29} vd v1 v2 v3 v4 FC14{ BC15{ BC16{ vd v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 Fp[2] FC5 Fp} vd v44 v45 v46 v47 v48 v49 Fp Fi FC8 FC12 Fi} vd v30 v31 v32 v33 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC17{ BC18{ BC19{ vd v54 v55 v56 v57 v58 v59 v60 v61 v62 v63 Fp[2] FC5 Fp} vd v64 v65 v66 v67 v68 v69 Fp Fi FC20{ m Fp Fi FC21{ m} FC21} FC12 Fi} vd v50 v51 v52 v53 FC22{ m FC13} FC22 Fi[6] FC23{ m FC24{ m FL}} FC23 Fc[7] Fi[2] FC12 FC12 FC12 FC12 FC12 Fc[7]}}


 S1491C1 ::~S1491C1(){ note_dtor("S1491C1", this);}
void  S1491C1 ::v1(){vfunc_called(this, "_ZN7S1491C12v1Ev");}
void  S1491C1 ::v2(){vfunc_called(this, "_ZN7S1491C12v2Ev");}
void  S1491C1 ::v3(){vfunc_called(this, "_ZN7S1491C12v3Ev");}
void  S1491C1 ::v4(){vfunc_called(this, "_ZN7S1491C12v4Ev");}
S1491C1 ::S1491C1(){ note_ctor("S1491C1", this);} // tgen

static void Test_S1491C1()
{
  extern Class_Descriptor cd_S1491C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(91,142)];
    init_test(&cd_S1491C1, buf);
    S1491C1 *dp, &lv = *(dp=new (buf) S1491C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(720,564), "sizeof(S1491C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1491C1)");
    check_base_class_offset(lv, (S1491C4*)(S1491C3*)(S1491C2*), 0, "S1491C1");
    check_base_class_offset(lv, (S1491C3*)(S1491C2*), 0, "S1491C1");
    check_base_class_offset(lv, (S1491C2*), 0, "S1491C1");
    check_field_offset(lv, s1491c1f0, ABISELECT(136,92), "S1491C1.s1491c1f0");
    check_field_offset(lv, s1491c1f1, ABISELECT(432,316), "S1491C1.s1491c1f1");
    test_class_info(&lv, &cd_S1491C1);
    dp->~S1491C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1491C1(Test_S1491C1, "S1491C1", ABISELECT(720,564));

#else // __cplusplus

extern void _ZN7S1491C1C1Ev();
extern void _ZN7S1491C1D1Ev();
Name_Map name_map_S1491C1[] = {
  NSPAIR(_ZN7S1491C1C1Ev),
  NSPAIR(_ZN7S1491C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1491C4;
extern VTBL_ENTRY _ZTI7S1491C4[];
extern  VTBL_ENTRY _ZTV7S1491C4[];
extern Class_Descriptor cd_S1491C3;
extern VTBL_ENTRY _ZTI7S1491C3[];
extern  VTBL_ENTRY _ZTV7S1491C3[];
extern Class_Descriptor cd_S1491C2;
extern VTBL_ENTRY _ZTI7S1491C2[];
extern  VTBL_ENTRY _ZTV7S1491C2[];
static Base_Class bases_S1491C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1491C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1491C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1491C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1491C1[];
extern void _ZN7S1491C1D1Ev();
extern void _ZN7S1491C1D0Ev();
extern void _ZN7S1491C42v5Ev();
extern void _ZN7S1491C42v6Ev();
extern void _ZN7S1491C42v7Ev();
extern void _ZN7S1491C42v8Ev();
extern void _ZN7S1491C42v9Ev();
extern void _ZN7S1491C43v10Ev();
extern void _ZN7S1491C43v11Ev();
extern void _ZN7S1491C43v12Ev();
extern void _ZN7S1491C43v13Ev();
extern void _ZN7S1491C43v14Ev();
extern void _ZN7S1491C33v15Ev();
extern void _ZN7S1491C33v16Ev();
extern void _ZN7S1491C33v17Ev();
extern void _ZN7S1491C33v18Ev();
extern void _ZN7S1491C33v19Ev();
extern void _ZN7S1491C33v20Ev();
extern void _ZN7S1491C33v21Ev();
extern void _ZN7S1491C33v22Ev();
extern void _ZN7S1491C33v23Ev();
extern void _ZN7S1491C33v24Ev();
extern void _ZN7S1491C33v25Ev();
extern void _ZN7S1491C33v26Ev();
extern void _ZN7S1491C33v27Ev();
extern void _ZN7S1491C33v28Ev();
extern void _ZN7S1491C23v29Ev();
extern void _ZN7S1491C12v1Ev();
extern void _ZN7S1491C12v2Ev();
extern void _ZN7S1491C12v3Ev();
extern void _ZN7S1491C12v4Ev();
static  VTBL_ENTRY vtc_S1491C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1491C1[0]),
  (VTBL_ENTRY)&_ZN7S1491C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1491C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1491C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1491C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1491C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1491C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1491C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1491C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1491C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1491C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1491C1[];
extern  VTBL_ENTRY _ZTV7S1491C1[];
Class_Descriptor cd_S1491C1 = {  "S1491C1", // class name
  bases_S1491C1, 3,
  &(vtc_S1491C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(720,564), // object size
  NSPAIRA(_ZTI7S1491C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1491C1),33, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3323C3  {
  void *s3323c3f0[2];
  ::S10103C13_nt s3323c3f1;
  void *s3323c3f2;
  virtual  ~S3323C3(); // _ZN7S3323C3D1Ev
  virtual void  v5(); // _ZN7S3323C32v5Ev
  virtual void  v6(); // _ZN7S3323C32v6Ev
  virtual void  v7(); // _ZN7S3323C32v7Ev
  virtual void  v8(); // _ZN7S3323C32v8Ev
  virtual void  v9(); // _ZN7S3323C32v9Ev
  virtual void  v10(); // _ZN7S3323C33v10Ev
  virtual void  v11(); // _ZN7S3323C33v11Ev
  virtual void  v12(); // _ZN7S3323C33v12Ev
  virtual void  v13(); // _ZN7S3323C33v13Ev
  virtual void  v14(); // _ZN7S3323C33v14Ev
  S3323C3(); // tgen
};
//SIG(-1 S3323C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3323C3 ::~S3323C3(){ note_dtor("S3323C3", this);}
void  S3323C3 ::v5(){vfunc_called(this, "_ZN7S3323C32v5Ev");}
void  S3323C3 ::v6(){vfunc_called(this, "_ZN7S3323C32v6Ev");}
void  S3323C3 ::v7(){vfunc_called(this, "_ZN7S3323C32v7Ev");}
void  S3323C3 ::v8(){vfunc_called(this, "_ZN7S3323C32v8Ev");}
void  S3323C3 ::v9(){vfunc_called(this, "_ZN7S3323C32v9Ev");}
void  S3323C3 ::v10(){vfunc_called(this, "_ZN7S3323C33v10Ev");}
void  S3323C3 ::v11(){vfunc_called(this, "_ZN7S3323C33v11Ev");}
void  S3323C3 ::v12(){vfunc_called(this, "_ZN7S3323C33v12Ev");}
void  S3323C3 ::v13(){vfunc_called(this, "_ZN7S3323C33v13Ev");}
void  S3323C3 ::v14(){vfunc_called(this, "_ZN7S3323C33v14Ev");}
S3323C3 ::S3323C3(){ note_ctor("S3323C3", this);} // tgen

static void Test_S3323C3()
{
  extern Class_Descriptor cd_S3323C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3323C3, buf);
    S3323C3 *dp, &lv = *(dp=new (buf) S3323C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3323C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3323C3)");
    check_field_offset(lv, s3323c3f0, ABISELECT(8,4), "S3323C3.s3323c3f0");
    check_field_offset(lv, s3323c3f1, ABISELECT(24,12), "S3323C3.s3323c3f1");
    check_field_offset(lv, s3323c3f2, ABISELECT(48,28), "S3323C3.s3323c3f2");
    test_class_info(&lv, &cd_S3323C3);
    dp->~S3323C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3323C3(Test_S3323C3, "S3323C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3323C3C1Ev();
extern void _ZN7S3323C3D1Ev();
Name_Map name_map_S3323C3[] = {
  NSPAIR(_ZN7S3323C3C1Ev),
  NSPAIR(_ZN7S3323C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3323C3[];
extern void _ZN7S3323C3D1Ev();
extern void _ZN7S3323C3D0Ev();
extern void _ZN7S3323C32v5Ev();
extern void _ZN7S3323C32v6Ev();
extern void _ZN7S3323C32v7Ev();
extern void _ZN7S3323C32v8Ev();
extern void _ZN7S3323C32v9Ev();
extern void _ZN7S3323C33v10Ev();
extern void _ZN7S3323C33v11Ev();
extern void _ZN7S3323C33v12Ev();
extern void _ZN7S3323C33v13Ev();
extern void _ZN7S3323C33v14Ev();
static  VTBL_ENTRY vtc_S3323C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3323C3[0]),
  (VTBL_ENTRY)&_ZN7S3323C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3323C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3323C3[];
extern  VTBL_ENTRY _ZTV7S3323C3[];
Class_Descriptor cd_S3323C3 = {  "S3323C3", // class name
  0,0,//no base classes
  &(vtc_S3323C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3323C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3323C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3323C2  : S3323C3 {
  ::S10103C86 s3323c2f0;
  ::S10103C106 s3323c2f1;
  ::S10103C82_nt s3323c2f2;
  ::S10103C13_nt s3323c2f3;
  virtual  ~S3323C2(); // _ZN7S3323C2D1Ev
  virtual void  v15(); // _ZN7S3323C23v15Ev
  virtual void  v16(); // _ZN7S3323C23v16Ev
  virtual void  v17(); // _ZN7S3323C23v17Ev
  virtual void  v18(); // _ZN7S3323C23v18Ev
  virtual void  v19(); // _ZN7S3323C23v19Ev
  virtual void  v20(); // _ZN7S3323C23v20Ev
  virtual void  v21(); // _ZN7S3323C23v21Ev
  virtual void  v22(); // _ZN7S3323C23v22Ev
  virtual void  v23(); // _ZN7S3323C23v23Ev
  virtual void  v24(); // _ZN7S3323C23v24Ev
  virtual void  v25(); // _ZN7S3323C23v25Ev
  virtual void  v26(); // _ZN7S3323C23v26Ev
  virtual void  v27(); // _ZN7S3323C23v27Ev
  virtual void  v28(); // _ZN7S3323C23v28Ev
  S3323C2(); // tgen
};
//SIG(-1 S3323C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3323C2 ::~S3323C2(){ note_dtor("S3323C2", this);}
void  S3323C2 ::v15(){vfunc_called(this, "_ZN7S3323C23v15Ev");}
void  S3323C2 ::v16(){vfunc_called(this, "_ZN7S3323C23v16Ev");}
void  S3323C2 ::v17(){vfunc_called(this, "_ZN7S3323C23v17Ev");}
void  S3323C2 ::v18(){vfunc_called(this, "_ZN7S3323C23v18Ev");}
void  S3323C2 ::v19(){vfunc_called(this, "_ZN7S3323C23v19Ev");}
void  S3323C2 ::v20(){vfunc_called(this, "_ZN7S3323C23v20Ev");}
void  S3323C2 ::v21(){vfunc_called(this, "_ZN7S3323C23v21Ev");}
void  S3323C2 ::v22(){vfunc_called(this, "_ZN7S3323C23v22Ev");}
void  S3323C2 ::v23(){vfunc_called(this, "_ZN7S3323C23v23Ev");}
void  S3323C2 ::v24(){vfunc_called(this, "_ZN7S3323C23v24Ev");}
void  S3323C2 ::v25(){vfunc_called(this, "_ZN7S3323C23v25Ev");}
void  S3323C2 ::v26(){vfunc_called(this, "_ZN7S3323C23v26Ev");}
void  S3323C2 ::v27(){vfunc_called(this, "_ZN7S3323C23v27Ev");}
void  S3323C2 ::v28(){vfunc_called(this, "_ZN7S3323C23v28Ev");}
S3323C2 ::S3323C2(){ note_ctor("S3323C2", this);} // tgen

static void Test_S3323C2()
{
  extern Class_Descriptor cd_S3323C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3323C2, buf);
    S3323C2 *dp, &lv = *(dp=new (buf) S3323C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3323C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3323C2)");
    check_base_class_offset(lv, (S3323C3*), 0, "S3323C2");
    check_field_offset(lv, s3323c2f0, ABISELECT(56,32), "S3323C2.s3323c2f0");
    check_field_offset(lv, s3323c2f1, ABISELECT(72,44), "S3323C2.s3323c2f1");
    check_field_offset(lv, s3323c2f2, ABISELECT(96,60), "S3323C2.s3323c2f2");
    check_field_offset(lv, s3323c2f3, ABISELECT(112,76), "S3323C2.s3323c2f3");
    test_class_info(&lv, &cd_S3323C2);
    dp->~S3323C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3323C2(Test_S3323C2, "S3323C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3323C2C1Ev();
extern void _ZN7S3323C2D1Ev();
Name_Map name_map_S3323C2[] = {
  NSPAIR(_ZN7S3323C2C1Ev),
  NSPAIR(_ZN7S3323C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3323C3;
extern VTBL_ENTRY _ZTI7S3323C3[];
extern  VTBL_ENTRY _ZTV7S3323C3[];
static Base_Class bases_S3323C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3323C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3323C2[];
extern void _ZN7S3323C2D1Ev();
extern void _ZN7S3323C2D0Ev();
extern void _ZN7S3323C32v5Ev();
extern void _ZN7S3323C32v6Ev();
extern void _ZN7S3323C32v7Ev();
extern void _ZN7S3323C32v8Ev();
extern void _ZN7S3323C32v9Ev();
extern void _ZN7S3323C33v10Ev();
extern void _ZN7S3323C33v11Ev();
extern void _ZN7S3323C33v12Ev();
extern void _ZN7S3323C33v13Ev();
extern void _ZN7S3323C33v14Ev();
extern void _ZN7S3323C23v15Ev();
extern void _ZN7S3323C23v16Ev();
extern void _ZN7S3323C23v17Ev();
extern void _ZN7S3323C23v18Ev();
extern void _ZN7S3323C23v19Ev();
extern void _ZN7S3323C23v20Ev();
extern void _ZN7S3323C23v21Ev();
extern void _ZN7S3323C23v22Ev();
extern void _ZN7S3323C23v23Ev();
extern void _ZN7S3323C23v24Ev();
extern void _ZN7S3323C23v25Ev();
extern void _ZN7S3323C23v26Ev();
extern void _ZN7S3323C23v27Ev();
extern void _ZN7S3323C23v28Ev();
static  VTBL_ENTRY vtc_S3323C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3323C2[0]),
  (VTBL_ENTRY)&_ZN7S3323C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3323C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v28Ev,
};
extern VTBL_ENTRY _ZTI7S3323C2[];
extern  VTBL_ENTRY _ZTV7S3323C2[];
Class_Descriptor cd_S3323C2 = {  "S3323C2", // class name
  bases_S3323C2, 1,
  &(vtc_S3323C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3323C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3323C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3323C1  : S3323C2 {
  ::S10103C84 s3323c1f0;
  ::S679C23 s3323c1f1;
  ::S10103C84 s3323c1f2;
  ::S10103C84 s3323c1f3;
  virtual  ~S3323C1(); // _ZN7S3323C1D1Ev
  virtual void  v1(); // _ZN7S3323C12v1Ev
  virtual void  v2(); // _ZN7S3323C12v2Ev
  virtual void  v3(); // _ZN7S3323C12v3Ev
  virtual void  v4(); // _ZN7S3323C12v4Ev
  S3323C1(); // tgen
};
//SIG(1 S3323C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]} FC16{ BC17{ BC18{ vd v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 Fp[2] FC4 Fp} vd v63 v64 v65 v66 v67 v68 Fp Fi FC19{ m Fp Fi FC20{ m} FC20} FC11 Fi} vd v49 v50 v51 v52 FC21{ m FC12} FC21 Fi[6] FC22{ m FC23{ m FL}} FC22 Fc[7] Fi[2] FC11 FC11 FC11 FC11 FC11 Fc[7]} FC13 FC13}


 S3323C1 ::~S3323C1(){ note_dtor("S3323C1", this);}
void  S3323C1 ::v1(){vfunc_called(this, "_ZN7S3323C12v1Ev");}
void  S3323C1 ::v2(){vfunc_called(this, "_ZN7S3323C12v2Ev");}
void  S3323C1 ::v3(){vfunc_called(this, "_ZN7S3323C12v3Ev");}
void  S3323C1 ::v4(){vfunc_called(this, "_ZN7S3323C12v4Ev");}
S3323C1 ::S3323C1(){ note_ctor("S3323C1", this);} // tgen

static void Test_S3323C1()
{
  extern Class_Descriptor cd_S3323C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(165,254)];
    init_test(&cd_S3323C1, buf);
    S3323C1 *dp, &lv = *(dp=new (buf) S3323C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1312,1012), "sizeof(S3323C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3323C1)");
    check_base_class_offset(lv, (S3323C3*)(S3323C2*), 0, "S3323C1");
    check_base_class_offset(lv, (S3323C2*), 0, "S3323C1");
    check_field_offset(lv, s3323c1f0, ABISELECT(136,92), "S3323C1.s3323c1f0");
    check_field_offset(lv, s3323c1f1, ABISELECT(432,316), "S3323C1.s3323c1f1");
    check_field_offset(lv, s3323c1f2, ABISELECT(720,564), "S3323C1.s3323c1f2");
    check_field_offset(lv, s3323c1f3, ABISELECT(1016,788), "S3323C1.s3323c1f3");
    test_class_info(&lv, &cd_S3323C1);
    dp->~S3323C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3323C1(Test_S3323C1, "S3323C1", ABISELECT(1312,1012));

#else // __cplusplus

extern void _ZN7S3323C1C1Ev();
extern void _ZN7S3323C1D1Ev();
Name_Map name_map_S3323C1[] = {
  NSPAIR(_ZN7S3323C1C1Ev),
  NSPAIR(_ZN7S3323C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3323C3;
extern VTBL_ENTRY _ZTI7S3323C3[];
extern  VTBL_ENTRY _ZTV7S3323C3[];
extern Class_Descriptor cd_S3323C2;
extern VTBL_ENTRY _ZTI7S3323C2[];
extern  VTBL_ENTRY _ZTV7S3323C2[];
static Base_Class bases_S3323C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3323C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3323C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3323C1[];
extern void _ZN7S3323C1D1Ev();
extern void _ZN7S3323C1D0Ev();
extern void _ZN7S3323C32v5Ev();
extern void _ZN7S3323C32v6Ev();
extern void _ZN7S3323C32v7Ev();
extern void _ZN7S3323C32v8Ev();
extern void _ZN7S3323C32v9Ev();
extern void _ZN7S3323C33v10Ev();
extern void _ZN7S3323C33v11Ev();
extern void _ZN7S3323C33v12Ev();
extern void _ZN7S3323C33v13Ev();
extern void _ZN7S3323C33v14Ev();
extern void _ZN7S3323C23v15Ev();
extern void _ZN7S3323C23v16Ev();
extern void _ZN7S3323C23v17Ev();
extern void _ZN7S3323C23v18Ev();
extern void _ZN7S3323C23v19Ev();
extern void _ZN7S3323C23v20Ev();
extern void _ZN7S3323C23v21Ev();
extern void _ZN7S3323C23v22Ev();
extern void _ZN7S3323C23v23Ev();
extern void _ZN7S3323C23v24Ev();
extern void _ZN7S3323C23v25Ev();
extern void _ZN7S3323C23v26Ev();
extern void _ZN7S3323C23v27Ev();
extern void _ZN7S3323C23v28Ev();
extern void _ZN7S3323C12v1Ev();
extern void _ZN7S3323C12v2Ev();
extern void _ZN7S3323C12v3Ev();
extern void _ZN7S3323C12v4Ev();
static  VTBL_ENTRY vtc_S3323C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3323C1[0]),
  (VTBL_ENTRY)&_ZN7S3323C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3323C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3323C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3323C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3323C23v28Ev,
  (VTBL_ENTRY)&_ZN7S3323C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3323C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3323C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3323C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3323C1[];
extern  VTBL_ENTRY _ZTV7S3323C1[];
Class_Descriptor cd_S3323C1 = {  "S3323C1", // class name
  bases_S3323C1, 2,
  &(vtc_S3323C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1312,1012), // object size
  NSPAIRA(_ZTI7S3323C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3323C1),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1390C4  {
  void *s1390c4f0[2];
  ::S10103C13_nt s1390c4f1;
  void *s1390c4f2;
  virtual  ~S1390C4(); // _ZN7S1390C4D1Ev
  virtual void  v3(); // _ZN7S1390C42v3Ev
  virtual void  v4(); // _ZN7S1390C42v4Ev
  virtual void  v5(); // _ZN7S1390C42v5Ev
  virtual void  v6(); // _ZN7S1390C42v6Ev
  virtual void  v7(); // _ZN7S1390C42v7Ev
  virtual void  v8(); // _ZN7S1390C42v8Ev
  virtual void  v9(); // _ZN7S1390C42v9Ev
  virtual void  v10(); // _ZN7S1390C43v10Ev
  virtual void  v11(); // _ZN7S1390C43v11Ev
  virtual void  v12(); // _ZN7S1390C43v12Ev
  S1390C4(); // tgen
};
//SIG(-1 S1390C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1390C4 ::~S1390C4(){ note_dtor("S1390C4", this);}
void  S1390C4 ::v3(){vfunc_called(this, "_ZN7S1390C42v3Ev");}
void  S1390C4 ::v4(){vfunc_called(this, "_ZN7S1390C42v4Ev");}
void  S1390C4 ::v5(){vfunc_called(this, "_ZN7S1390C42v5Ev");}
void  S1390C4 ::v6(){vfunc_called(this, "_ZN7S1390C42v6Ev");}
void  S1390C4 ::v7(){vfunc_called(this, "_ZN7S1390C42v7Ev");}
void  S1390C4 ::v8(){vfunc_called(this, "_ZN7S1390C42v8Ev");}
void  S1390C4 ::v9(){vfunc_called(this, "_ZN7S1390C42v9Ev");}
void  S1390C4 ::v10(){vfunc_called(this, "_ZN7S1390C43v10Ev");}
void  S1390C4 ::v11(){vfunc_called(this, "_ZN7S1390C43v11Ev");}
void  S1390C4 ::v12(){vfunc_called(this, "_ZN7S1390C43v12Ev");}
S1390C4 ::S1390C4(){ note_ctor("S1390C4", this);} // tgen

static void Test_S1390C4()
{
  extern Class_Descriptor cd_S1390C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1390C4, buf);
    S1390C4 *dp, &lv = *(dp=new (buf) S1390C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1390C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1390C4)");
    check_field_offset(lv, s1390c4f0, ABISELECT(8,4), "S1390C4.s1390c4f0");
    check_field_offset(lv, s1390c4f1, ABISELECT(24,12), "S1390C4.s1390c4f1");
    check_field_offset(lv, s1390c4f2, ABISELECT(48,28), "S1390C4.s1390c4f2");
    test_class_info(&lv, &cd_S1390C4);
    dp->~S1390C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1390C4(Test_S1390C4, "S1390C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1390C4C1Ev();
extern void _ZN7S1390C4D1Ev();
Name_Map name_map_S1390C4[] = {
  NSPAIR(_ZN7S1390C4C1Ev),
  NSPAIR(_ZN7S1390C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1390C4[];
extern void _ZN7S1390C4D1Ev();
extern void _ZN7S1390C4D0Ev();
extern void _ZN7S1390C42v3Ev();
extern void _ZN7S1390C42v4Ev();
extern void _ZN7S1390C42v5Ev();
extern void _ZN7S1390C42v6Ev();
extern void _ZN7S1390C42v7Ev();
extern void _ZN7S1390C42v8Ev();
extern void _ZN7S1390C42v9Ev();
extern void _ZN7S1390C43v10Ev();
extern void _ZN7S1390C43v11Ev();
extern void _ZN7S1390C43v12Ev();
static  VTBL_ENTRY vtc_S1390C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1390C4[0]),
  (VTBL_ENTRY)&_ZN7S1390C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1390C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v12Ev,
};
extern VTBL_ENTRY _ZTI7S1390C4[];
extern  VTBL_ENTRY _ZTV7S1390C4[];
Class_Descriptor cd_S1390C4 = {  "S1390C4", // class name
  0,0,//no base classes
  &(vtc_S1390C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1390C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1390C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1390C3  : S1390C4 {
  ::S10103C86 s1390c3f0;
  ::S10103C106 s1390c3f1;
  ::S10103C82_nt s1390c3f2;
  ::S10103C13_nt s1390c3f3;
  virtual  ~S1390C3(); // _ZN7S1390C3D1Ev
  virtual void  v13(); // _ZN7S1390C33v13Ev
  virtual void  v14(); // _ZN7S1390C33v14Ev
  virtual void  v15(); // _ZN7S1390C33v15Ev
  virtual void  v16(); // _ZN7S1390C33v16Ev
  virtual void  v17(); // _ZN7S1390C33v17Ev
  virtual void  v18(); // _ZN7S1390C33v18Ev
  virtual void  v19(); // _ZN7S1390C33v19Ev
  virtual void  v20(); // _ZN7S1390C33v20Ev
  virtual void  v21(); // _ZN7S1390C33v21Ev
  virtual void  v22(); // _ZN7S1390C33v22Ev
  virtual void  v23(); // _ZN7S1390C33v23Ev
  virtual void  v24(); // _ZN7S1390C33v24Ev
  virtual void  v25(); // _ZN7S1390C33v25Ev
  virtual void  v26(); // _ZN7S1390C33v26Ev
  S1390C3(); // tgen
};
//SIG(-1 S1390C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1390C3 ::~S1390C3(){ note_dtor("S1390C3", this);}
void  S1390C3 ::v13(){vfunc_called(this, "_ZN7S1390C33v13Ev");}
void  S1390C3 ::v14(){vfunc_called(this, "_ZN7S1390C33v14Ev");}
void  S1390C3 ::v15(){vfunc_called(this, "_ZN7S1390C33v15Ev");}
void  S1390C3 ::v16(){vfunc_called(this, "_ZN7S1390C33v16Ev");}
void  S1390C3 ::v17(){vfunc_called(this, "_ZN7S1390C33v17Ev");}
void  S1390C3 ::v18(){vfunc_called(this, "_ZN7S1390C33v18Ev");}
void  S1390C3 ::v19(){vfunc_called(this, "_ZN7S1390C33v19Ev");}
void  S1390C3 ::v20(){vfunc_called(this, "_ZN7S1390C33v20Ev");}
void  S1390C3 ::v21(){vfunc_called(this, "_ZN7S1390C33v21Ev");}
void  S1390C3 ::v22(){vfunc_called(this, "_ZN7S1390C33v22Ev");}
void  S1390C3 ::v23(){vfunc_called(this, "_ZN7S1390C33v23Ev");}
void  S1390C3 ::v24(){vfunc_called(this, "_ZN7S1390C33v24Ev");}
void  S1390C3 ::v25(){vfunc_called(this, "_ZN7S1390C33v25Ev");}
void  S1390C3 ::v26(){vfunc_called(this, "_ZN7S1390C33v26Ev");}
S1390C3 ::S1390C3(){ note_ctor("S1390C3", this);} // tgen

static void Test_S1390C3()
{
  extern Class_Descriptor cd_S1390C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1390C3, buf);
    S1390C3 *dp, &lv = *(dp=new (buf) S1390C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1390C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1390C3)");
    check_base_class_offset(lv, (S1390C4*), 0, "S1390C3");
    check_field_offset(lv, s1390c3f0, ABISELECT(56,32), "S1390C3.s1390c3f0");
    check_field_offset(lv, s1390c3f1, ABISELECT(72,44), "S1390C3.s1390c3f1");
    check_field_offset(lv, s1390c3f2, ABISELECT(96,60), "S1390C3.s1390c3f2");
    check_field_offset(lv, s1390c3f3, ABISELECT(112,76), "S1390C3.s1390c3f3");
    test_class_info(&lv, &cd_S1390C3);
    dp->~S1390C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1390C3(Test_S1390C3, "S1390C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1390C3C1Ev();
extern void _ZN7S1390C3D1Ev();
Name_Map name_map_S1390C3[] = {
  NSPAIR(_ZN7S1390C3C1Ev),
  NSPAIR(_ZN7S1390C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1390C4;
extern VTBL_ENTRY _ZTI7S1390C4[];
extern  VTBL_ENTRY _ZTV7S1390C4[];
static Base_Class bases_S1390C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1390C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1390C3[];
extern void _ZN7S1390C3D1Ev();
extern void _ZN7S1390C3D0Ev();
extern void _ZN7S1390C42v3Ev();
extern void _ZN7S1390C42v4Ev();
extern void _ZN7S1390C42v5Ev();
extern void _ZN7S1390C42v6Ev();
extern void _ZN7S1390C42v7Ev();
extern void _ZN7S1390C42v8Ev();
extern void _ZN7S1390C42v9Ev();
extern void _ZN7S1390C43v10Ev();
extern void _ZN7S1390C43v11Ev();
extern void _ZN7S1390C43v12Ev();
extern void _ZN7S1390C33v13Ev();
extern void _ZN7S1390C33v14Ev();
extern void _ZN7S1390C33v15Ev();
extern void _ZN7S1390C33v16Ev();
extern void _ZN7S1390C33v17Ev();
extern void _ZN7S1390C33v18Ev();
extern void _ZN7S1390C33v19Ev();
extern void _ZN7S1390C33v20Ev();
extern void _ZN7S1390C33v21Ev();
extern void _ZN7S1390C33v22Ev();
extern void _ZN7S1390C33v23Ev();
extern void _ZN7S1390C33v24Ev();
extern void _ZN7S1390C33v25Ev();
extern void _ZN7S1390C33v26Ev();
static  VTBL_ENTRY vtc_S1390C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1390C3[0]),
  (VTBL_ENTRY)&_ZN7S1390C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1390C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v26Ev,
};
extern VTBL_ENTRY _ZTI7S1390C3[];
extern  VTBL_ENTRY _ZTV7S1390C3[];
Class_Descriptor cd_S1390C3 = {  "S1390C3", // class name
  bases_S1390C3, 1,
  &(vtc_S1390C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1390C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1390C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1390C2  : S1390C3 {
  int s1390c2f0[3];
  ::S10103C30_nt s1390c2f1;
  ::S10103C30_nt s1390c2f2;
  ::S10103C84 s1390c2f3[4];
  ::S10103C84 s1390c2f4;
  ::S10103C84 s1390c2f5[2];
  virtual  ~S1390C2(); // _ZN7S1390C2D1Ev
  virtual void  v27(); // _ZN7S1390C23v27Ev
  virtual void  v28(); // _ZN7S1390C23v28Ev
  virtual void  v29(); // _ZN7S1390C23v29Ev
  virtual void  v30(); // _ZN7S1390C23v30Ev
  S1390C2(); // tgen
};
//SIG(-1 S1390C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi[3] FC13{ m FC14{ m FL}} FC13 FC15{ BC16{ BC17{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}[4] FC15 FC15[2]}


 S1390C2 ::~S1390C2(){ note_dtor("S1390C2", this);}
void  S1390C2 ::v27(){vfunc_called(this, "_ZN7S1390C23v27Ev");}
void  S1390C2 ::v28(){vfunc_called(this, "_ZN7S1390C23v28Ev");}
void  S1390C2 ::v29(){vfunc_called(this, "_ZN7S1390C23v29Ev");}
void  S1390C2 ::v30(){vfunc_called(this, "_ZN7S1390C23v30Ev");}
S1390C2 ::S1390C2(){ note_ctor("S1390C2", this);} // tgen

static void Test_S1390C2()
{
  extern Class_Descriptor cd_S1390C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(281,423)];
    init_test(&cd_S1390C2, buf);
    S1390C2 *dp, &lv = *(dp=new (buf) S1390C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2240,1688), "sizeof(S1390C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1390C2)");
    check_base_class_offset(lv, (S1390C4*)(S1390C3*), 0, "S1390C2");
    check_base_class_offset(lv, (S1390C3*), 0, "S1390C2");
    check_field_offset(lv, s1390c2f0, ABISELECT(136,92), "S1390C2.s1390c2f0");
    check_field_offset(lv, s1390c2f1, ABISELECT(152,104), "S1390C2.s1390c2f1");
    check_field_offset(lv, s1390c2f2, ABISELECT(160,112), "S1390C2.s1390c2f2");
    check_field_offset(lv, s1390c2f3, ABISELECT(168,120), "S1390C2.s1390c2f3");
    check_field_offset(lv, s1390c2f4, ABISELECT(1352,1016), "S1390C2.s1390c2f4");
    check_field_offset(lv, s1390c2f5, ABISELECT(1648,1240), "S1390C2.s1390c2f5");
    test_class_info(&lv, &cd_S1390C2);
    dp->~S1390C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1390C2(Test_S1390C2, "S1390C2", ABISELECT(2240,1688));

#else // __cplusplus

extern void _ZN7S1390C2C1Ev();
extern void _ZN7S1390C2D1Ev();
Name_Map name_map_S1390C2[] = {
  NSPAIR(_ZN7S1390C2C1Ev),
  NSPAIR(_ZN7S1390C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1390C4;
extern VTBL_ENTRY _ZTI7S1390C4[];
extern  VTBL_ENTRY _ZTV7S1390C4[];
extern Class_Descriptor cd_S1390C3;
extern VTBL_ENTRY _ZTI7S1390C3[];
extern  VTBL_ENTRY _ZTV7S1390C3[];
static Base_Class bases_S1390C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1390C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1390C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1390C2[];
extern void _ZN7S1390C2D1Ev();
extern void _ZN7S1390C2D0Ev();
extern void _ZN7S1390C42v3Ev();
extern void _ZN7S1390C42v4Ev();
extern void _ZN7S1390C42v5Ev();
extern void _ZN7S1390C42v6Ev();
extern void _ZN7S1390C42v7Ev();
extern void _ZN7S1390C42v8Ev();
extern void _ZN7S1390C42v9Ev();
extern void _ZN7S1390C43v10Ev();
extern void _ZN7S1390C43v11Ev();
extern void _ZN7S1390C43v12Ev();
extern void _ZN7S1390C33v13Ev();
extern void _ZN7S1390C33v14Ev();
extern void _ZN7S1390C33v15Ev();
extern void _ZN7S1390C33v16Ev();
extern void _ZN7S1390C33v17Ev();
extern void _ZN7S1390C33v18Ev();
extern void _ZN7S1390C33v19Ev();
extern void _ZN7S1390C33v20Ev();
extern void _ZN7S1390C33v21Ev();
extern void _ZN7S1390C33v22Ev();
extern void _ZN7S1390C33v23Ev();
extern void _ZN7S1390C33v24Ev();
extern void _ZN7S1390C33v25Ev();
extern void _ZN7S1390C33v26Ev();
extern void _ZN7S1390C23v27Ev();
extern void _ZN7S1390C23v28Ev();
extern void _ZN7S1390C23v29Ev();
extern void _ZN7S1390C23v30Ev();
static  VTBL_ENTRY vtc_S1390C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1390C2[0]),
  (VTBL_ENTRY)&_ZN7S1390C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1390C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v30Ev,
};
extern VTBL_ENTRY _ZTI7S1390C2[];
extern  VTBL_ENTRY _ZTV7S1390C2[];
Class_Descriptor cd_S1390C2 = {  "S1390C2", // class name
  bases_S1390C2, 2,
  &(vtc_S1390C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2240,1688), // object size
  NSPAIRA(_ZTI7S1390C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1390C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1390C1  : S1390C2 {
  ::S10103C84 s1390c1f0[2];
  virtual  ~S1390C1(); // _ZN7S1390C1D1Ev
  virtual void  v1(); // _ZN7S1390C12v1Ev
  virtual void  v2(); // _ZN7S1390C12v2Ev
  S1390C1(); // tgen
};
//SIG(1 S1390C1) C1{ BC2{ BC3{ BC4{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} vd v27 v28 v29 v30 Fi[3] FC14{ m FC15{ m FL}} FC14 FC16{ BC17{ BC18{ vd v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 Fp[2] FC5 Fp} vd v45 v46 v47 v48 v49 v50 Fp Fi FC8 FC12 Fi} vd v31 v32 v33 v34 FC5[4] FC12 FC12 FC12 FC12 Fi[6]}[4] FC16 FC16[2]} vd v1 v2 FC16[2]}


 S1390C1 ::~S1390C1(){ note_dtor("S1390C1", this);}
void  S1390C1 ::v1(){vfunc_called(this, "_ZN7S1390C12v1Ev");}
void  S1390C1 ::v2(){vfunc_called(this, "_ZN7S1390C12v2Ev");}
S1390C1 ::S1390C1(){ note_ctor("S1390C1", this);} // tgen

static void Test_S1390C1()
{
  extern Class_Descriptor cd_S1390C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(355,535)];
    init_test(&cd_S1390C1, buf);
    S1390C1 *dp, &lv = *(dp=new (buf) S1390C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2832,2136), "sizeof(S1390C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1390C1)");
    check_base_class_offset(lv, (S1390C4*)(S1390C3*)(S1390C2*), 0, "S1390C1");
    check_base_class_offset(lv, (S1390C3*)(S1390C2*), 0, "S1390C1");
    check_base_class_offset(lv, (S1390C2*), 0, "S1390C1");
    check_field_offset(lv, s1390c1f0, ABISELECT(2240,1688), "S1390C1.s1390c1f0");
    test_class_info(&lv, &cd_S1390C1);
    dp->~S1390C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1390C1(Test_S1390C1, "S1390C1", ABISELECT(2832,2136));

#else // __cplusplus

extern void _ZN7S1390C1C1Ev();
extern void _ZN7S1390C1D1Ev();
Name_Map name_map_S1390C1[] = {
  NSPAIR(_ZN7S1390C1C1Ev),
  NSPAIR(_ZN7S1390C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1390C4;
extern VTBL_ENTRY _ZTI7S1390C4[];
extern  VTBL_ENTRY _ZTV7S1390C4[];
extern Class_Descriptor cd_S1390C3;
extern VTBL_ENTRY _ZTI7S1390C3[];
extern  VTBL_ENTRY _ZTV7S1390C3[];
extern Class_Descriptor cd_S1390C2;
extern VTBL_ENTRY _ZTI7S1390C2[];
extern  VTBL_ENTRY _ZTV7S1390C2[];
static Base_Class bases_S1390C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1390C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1390C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1390C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1390C1[];
extern void _ZN7S1390C1D1Ev();
extern void _ZN7S1390C1D0Ev();
extern void _ZN7S1390C42v3Ev();
extern void _ZN7S1390C42v4Ev();
extern void _ZN7S1390C42v5Ev();
extern void _ZN7S1390C42v6Ev();
extern void _ZN7S1390C42v7Ev();
extern void _ZN7S1390C42v8Ev();
extern void _ZN7S1390C42v9Ev();
extern void _ZN7S1390C43v10Ev();
extern void _ZN7S1390C43v11Ev();
extern void _ZN7S1390C43v12Ev();
extern void _ZN7S1390C33v13Ev();
extern void _ZN7S1390C33v14Ev();
extern void _ZN7S1390C33v15Ev();
extern void _ZN7S1390C33v16Ev();
extern void _ZN7S1390C33v17Ev();
extern void _ZN7S1390C33v18Ev();
extern void _ZN7S1390C33v19Ev();
extern void _ZN7S1390C33v20Ev();
extern void _ZN7S1390C33v21Ev();
extern void _ZN7S1390C33v22Ev();
extern void _ZN7S1390C33v23Ev();
extern void _ZN7S1390C33v24Ev();
extern void _ZN7S1390C33v25Ev();
extern void _ZN7S1390C33v26Ev();
extern void _ZN7S1390C23v27Ev();
extern void _ZN7S1390C23v28Ev();
extern void _ZN7S1390C23v29Ev();
extern void _ZN7S1390C23v30Ev();
extern void _ZN7S1390C12v1Ev();
extern void _ZN7S1390C12v2Ev();
static  VTBL_ENTRY vtc_S1390C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1390C1[0]),
  (VTBL_ENTRY)&_ZN7S1390C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1390C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1390C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1390C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1390C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1390C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1390C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1390C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S1390C1[];
extern  VTBL_ENTRY _ZTV7S1390C1[];
Class_Descriptor cd_S1390C1 = {  "S1390C1", // class name
  bases_S1390C1, 3,
  &(vtc_S1390C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2832,2136), // object size
  NSPAIRA(_ZTI7S1390C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1390C1),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1486C4  {
  void *s1486c4f0[2];
  ::S10103C13_nt s1486c4f1;
  void *s1486c4f2;
  virtual  ~S1486C4(); // _ZN7S1486C4D1Ev
  virtual void  v5(); // _ZN7S1486C42v5Ev
  virtual void  v6(); // _ZN7S1486C42v6Ev
  virtual void  v7(); // _ZN7S1486C42v7Ev
  virtual void  v8(); // _ZN7S1486C42v8Ev
  virtual void  v9(); // _ZN7S1486C42v9Ev
  virtual void  v10(); // _ZN7S1486C43v10Ev
  virtual void  v11(); // _ZN7S1486C43v11Ev
  virtual void  v12(); // _ZN7S1486C43v12Ev
  virtual void  v13(); // _ZN7S1486C43v13Ev
  virtual void  v14(); // _ZN7S1486C43v14Ev
  S1486C4(); // tgen
};
//SIG(-1 S1486C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1486C4 ::~S1486C4(){ note_dtor("S1486C4", this);}
void  S1486C4 ::v5(){vfunc_called(this, "_ZN7S1486C42v5Ev");}
void  S1486C4 ::v6(){vfunc_called(this, "_ZN7S1486C42v6Ev");}
void  S1486C4 ::v7(){vfunc_called(this, "_ZN7S1486C42v7Ev");}
void  S1486C4 ::v8(){vfunc_called(this, "_ZN7S1486C42v8Ev");}
void  S1486C4 ::v9(){vfunc_called(this, "_ZN7S1486C42v9Ev");}
void  S1486C4 ::v10(){vfunc_called(this, "_ZN7S1486C43v10Ev");}
void  S1486C4 ::v11(){vfunc_called(this, "_ZN7S1486C43v11Ev");}
void  S1486C4 ::v12(){vfunc_called(this, "_ZN7S1486C43v12Ev");}
void  S1486C4 ::v13(){vfunc_called(this, "_ZN7S1486C43v13Ev");}
void  S1486C4 ::v14(){vfunc_called(this, "_ZN7S1486C43v14Ev");}
S1486C4 ::S1486C4(){ note_ctor("S1486C4", this);} // tgen

static void Test_S1486C4()
{
  extern Class_Descriptor cd_S1486C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1486C4, buf);
    S1486C4 *dp, &lv = *(dp=new (buf) S1486C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1486C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1486C4)");
    check_field_offset(lv, s1486c4f0, ABISELECT(8,4), "S1486C4.s1486c4f0");
    check_field_offset(lv, s1486c4f1, ABISELECT(24,12), "S1486C4.s1486c4f1");
    check_field_offset(lv, s1486c4f2, ABISELECT(48,28), "S1486C4.s1486c4f2");
    test_class_info(&lv, &cd_S1486C4);
    dp->~S1486C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1486C4(Test_S1486C4, "S1486C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1486C4C1Ev();
extern void _ZN7S1486C4D1Ev();
Name_Map name_map_S1486C4[] = {
  NSPAIR(_ZN7S1486C4C1Ev),
  NSPAIR(_ZN7S1486C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1486C4[];
extern void _ZN7S1486C4D1Ev();
extern void _ZN7S1486C4D0Ev();
extern void _ZN7S1486C42v5Ev();
extern void _ZN7S1486C42v6Ev();
extern void _ZN7S1486C42v7Ev();
extern void _ZN7S1486C42v8Ev();
extern void _ZN7S1486C42v9Ev();
extern void _ZN7S1486C43v10Ev();
extern void _ZN7S1486C43v11Ev();
extern void _ZN7S1486C43v12Ev();
extern void _ZN7S1486C43v13Ev();
extern void _ZN7S1486C43v14Ev();
static  VTBL_ENTRY vtc_S1486C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1486C4[0]),
  (VTBL_ENTRY)&_ZN7S1486C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1486C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1486C4[];
extern  VTBL_ENTRY _ZTV7S1486C4[];
Class_Descriptor cd_S1486C4 = {  "S1486C4", // class name
  0,0,//no base classes
  &(vtc_S1486C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1486C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1486C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1486C3  : S1486C4 {
  ::S10103C86 s1486c3f0;
  ::S10103C106 s1486c3f1;
  ::S10103C82_nt s1486c3f2;
  ::S10103C13_nt s1486c3f3;
  virtual  ~S1486C3(); // _ZN7S1486C3D1Ev
  virtual void  v15(); // _ZN7S1486C33v15Ev
  virtual void  v16(); // _ZN7S1486C33v16Ev
  virtual void  v17(); // _ZN7S1486C33v17Ev
  virtual void  v18(); // _ZN7S1486C33v18Ev
  virtual void  v19(); // _ZN7S1486C33v19Ev
  virtual void  v20(); // _ZN7S1486C33v20Ev
  virtual void  v21(); // _ZN7S1486C33v21Ev
  virtual void  v22(); // _ZN7S1486C33v22Ev
  virtual void  v23(); // _ZN7S1486C33v23Ev
  virtual void  v24(); // _ZN7S1486C33v24Ev
  virtual void  v25(); // _ZN7S1486C33v25Ev
  virtual void  v26(); // _ZN7S1486C33v26Ev
  virtual void  v27(); // _ZN7S1486C33v27Ev
  virtual void  v28(); // _ZN7S1486C33v28Ev
  S1486C3(); // tgen
};
//SIG(-1 S1486C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1486C3 ::~S1486C3(){ note_dtor("S1486C3", this);}
void  S1486C3 ::v15(){vfunc_called(this, "_ZN7S1486C33v15Ev");}
void  S1486C3 ::v16(){vfunc_called(this, "_ZN7S1486C33v16Ev");}
void  S1486C3 ::v17(){vfunc_called(this, "_ZN7S1486C33v17Ev");}
void  S1486C3 ::v18(){vfunc_called(this, "_ZN7S1486C33v18Ev");}
void  S1486C3 ::v19(){vfunc_called(this, "_ZN7S1486C33v19Ev");}
void  S1486C3 ::v20(){vfunc_called(this, "_ZN7S1486C33v20Ev");}
void  S1486C3 ::v21(){vfunc_called(this, "_ZN7S1486C33v21Ev");}
void  S1486C3 ::v22(){vfunc_called(this, "_ZN7S1486C33v22Ev");}
void  S1486C3 ::v23(){vfunc_called(this, "_ZN7S1486C33v23Ev");}
void  S1486C3 ::v24(){vfunc_called(this, "_ZN7S1486C33v24Ev");}
void  S1486C3 ::v25(){vfunc_called(this, "_ZN7S1486C33v25Ev");}
void  S1486C3 ::v26(){vfunc_called(this, "_ZN7S1486C33v26Ev");}
void  S1486C3 ::v27(){vfunc_called(this, "_ZN7S1486C33v27Ev");}
void  S1486C3 ::v28(){vfunc_called(this, "_ZN7S1486C33v28Ev");}
S1486C3 ::S1486C3(){ note_ctor("S1486C3", this);} // tgen

static void Test_S1486C3()
{
  extern Class_Descriptor cd_S1486C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1486C3, buf);
    S1486C3 *dp, &lv = *(dp=new (buf) S1486C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1486C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1486C3)");
    check_base_class_offset(lv, (S1486C4*), 0, "S1486C3");
    check_field_offset(lv, s1486c3f0, ABISELECT(56,32), "S1486C3.s1486c3f0");
    check_field_offset(lv, s1486c3f1, ABISELECT(72,44), "S1486C3.s1486c3f1");
    check_field_offset(lv, s1486c3f2, ABISELECT(96,60), "S1486C3.s1486c3f2");
    check_field_offset(lv, s1486c3f3, ABISELECT(112,76), "S1486C3.s1486c3f3");
    test_class_info(&lv, &cd_S1486C3);
    dp->~S1486C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1486C3(Test_S1486C3, "S1486C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1486C3C1Ev();
extern void _ZN7S1486C3D1Ev();
Name_Map name_map_S1486C3[] = {
  NSPAIR(_ZN7S1486C3C1Ev),
  NSPAIR(_ZN7S1486C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1486C4;
extern VTBL_ENTRY _ZTI7S1486C4[];
extern  VTBL_ENTRY _ZTV7S1486C4[];
static Base_Class bases_S1486C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1486C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1486C3[];
extern void _ZN7S1486C3D1Ev();
extern void _ZN7S1486C3D0Ev();
extern void _ZN7S1486C42v5Ev();
extern void _ZN7S1486C42v6Ev();
extern void _ZN7S1486C42v7Ev();
extern void _ZN7S1486C42v8Ev();
extern void _ZN7S1486C42v9Ev();
extern void _ZN7S1486C43v10Ev();
extern void _ZN7S1486C43v11Ev();
extern void _ZN7S1486C43v12Ev();
extern void _ZN7S1486C43v13Ev();
extern void _ZN7S1486C43v14Ev();
extern void _ZN7S1486C33v15Ev();
extern void _ZN7S1486C33v16Ev();
extern void _ZN7S1486C33v17Ev();
extern void _ZN7S1486C33v18Ev();
extern void _ZN7S1486C33v19Ev();
extern void _ZN7S1486C33v20Ev();
extern void _ZN7S1486C33v21Ev();
extern void _ZN7S1486C33v22Ev();
extern void _ZN7S1486C33v23Ev();
extern void _ZN7S1486C33v24Ev();
extern void _ZN7S1486C33v25Ev();
extern void _ZN7S1486C33v26Ev();
extern void _ZN7S1486C33v27Ev();
extern void _ZN7S1486C33v28Ev();
static  VTBL_ENTRY vtc_S1486C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1486C3[0]),
  (VTBL_ENTRY)&_ZN7S1486C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1486C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v28Ev,
};
extern VTBL_ENTRY _ZTI7S1486C3[];
extern  VTBL_ENTRY _ZTV7S1486C3[];
Class_Descriptor cd_S1486C3 = {  "S1486C3", // class name
  bases_S1486C3, 1,
  &(vtc_S1486C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1486C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1486C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1486C2  : S1486C3 {
  ::S10103C84 s1486c2f0;
  ::S10103C82_nt s1486c2f1;
  ::S10103C82_nt s1486c2f2;
  virtual void  v29(); // _ZN7S1486C23v29Ev
  virtual void  v30(); // _ZN7S1486C23v30Ev
  virtual void  v31(); // _ZN7S1486C23v31Ev
  virtual void  v32(); // _ZN7S1486C23v32Ev
  ~S1486C2(); // tgen
  S1486C2(); // tgen
};
//SIG(-1 S1486C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]} FC11 FC11}


void  S1486C2 ::v29(){vfunc_called(this, "_ZN7S1486C23v29Ev");}
void  S1486C2 ::v30(){vfunc_called(this, "_ZN7S1486C23v30Ev");}
void  S1486C2 ::v31(){vfunc_called(this, "_ZN7S1486C23v31Ev");}
void  S1486C2 ::v32(){vfunc_called(this, "_ZN7S1486C23v32Ev");}
S1486C2 ::~S1486C2(){ note_dtor("S1486C2", this);} // tgen
S1486C2 ::S1486C2(){ note_ctor("S1486C2", this);} // tgen

static void Test_S1486C2()
{
  extern Class_Descriptor cd_S1486C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(59,88)];
    init_test(&cd_S1486C2, buf);
    S1486C2 *dp, &lv = *(dp=new (buf) S1486C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(464,348), "sizeof(S1486C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1486C2)");
    check_base_class_offset(lv, (S1486C4*)(S1486C3*), 0, "S1486C2");
    check_base_class_offset(lv, (S1486C3*), 0, "S1486C2");
    check_field_offset(lv, s1486c2f0, ABISELECT(136,92), "S1486C2.s1486c2f0");
    check_field_offset(lv, s1486c2f1, ABISELECT(432,316), "S1486C2.s1486c2f1");
    check_field_offset(lv, s1486c2f2, ABISELECT(448,332), "S1486C2.s1486c2f2");
    test_class_info(&lv, &cd_S1486C2);
    dp->~S1486C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1486C2(Test_S1486C2, "S1486C2", ABISELECT(464,348));

#else // __cplusplus

extern void _ZN7S1486C2C1Ev();
extern void _ZN7S1486C2D1Ev();
Name_Map name_map_S1486C2[] = {
  NSPAIR(_ZN7S1486C2C1Ev),
  NSPAIR(_ZN7S1486C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1486C4;
extern VTBL_ENTRY _ZTI7S1486C4[];
extern  VTBL_ENTRY _ZTV7S1486C4[];
extern Class_Descriptor cd_S1486C3;
extern VTBL_ENTRY _ZTI7S1486C3[];
extern  VTBL_ENTRY _ZTV7S1486C3[];
static Base_Class bases_S1486C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1486C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1486C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1486C2[];
extern void _ZN7S1486C2D1Ev();
extern void _ZN7S1486C2D0Ev();
extern void _ZN7S1486C42v5Ev();
extern void _ZN7S1486C42v6Ev();
extern void _ZN7S1486C42v7Ev();
extern void _ZN7S1486C42v8Ev();
extern void _ZN7S1486C42v9Ev();
extern void _ZN7S1486C43v10Ev();
extern void _ZN7S1486C43v11Ev();
extern void _ZN7S1486C43v12Ev();
extern void _ZN7S1486C43v13Ev();
extern void _ZN7S1486C43v14Ev();
extern void _ZN7S1486C33v15Ev();
extern void _ZN7S1486C33v16Ev();
extern void _ZN7S1486C33v17Ev();
extern void _ZN7S1486C33v18Ev();
extern void _ZN7S1486C33v19Ev();
extern void _ZN7S1486C33v20Ev();
extern void _ZN7S1486C33v21Ev();
extern void _ZN7S1486C33v22Ev();
extern void _ZN7S1486C33v23Ev();
extern void _ZN7S1486C33v24Ev();
extern void _ZN7S1486C33v25Ev();
extern void _ZN7S1486C33v26Ev();
extern void _ZN7S1486C33v27Ev();
extern void _ZN7S1486C33v28Ev();
extern void _ZN7S1486C23v29Ev();
extern void _ZN7S1486C23v30Ev();
extern void _ZN7S1486C23v31Ev();
extern void _ZN7S1486C23v32Ev();
static  VTBL_ENTRY vtc_S1486C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1486C2[0]),
  (VTBL_ENTRY)&_ZN7S1486C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1486C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v32Ev,
};
extern VTBL_ENTRY _ZTI7S1486C2[];
extern  VTBL_ENTRY _ZTV7S1486C2[];
Class_Descriptor cd_S1486C2 = {  "S1486C2", // class name
  bases_S1486C2, 2,
  &(vtc_S1486C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(464,348), // object size
  NSPAIRA(_ZTI7S1486C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1486C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1486C1  : S1486C2 {
  ::S10103C30_nt s1486c1f0;
  ::S10103C30_nt s1486c1f1;
  ::S10103C82_nt s1486c1f2;
  int s1486c1f3;
  virtual void  v1(); // _ZN7S1486C12v1Ev
  virtual void  v2(); // _ZN7S1486C12v2Ev
  virtual void  v3(); // _ZN7S1486C12v3Ev
  virtual void  v4(); // _ZN7S1486C12v4Ev
  ~S1486C1(); // tgen
  S1486C1(); // tgen
};
//SIG(1 S1486C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 FC14{ BC15{ BC16{ vd v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 Fp[2] FC5 Fp} vd v47 v48 v49 v50 v51 v52 Fp Fi FC8 FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC12 FC12} v1 v2 v3 v4 FC17{ m FC18{ m FL}} FC17 FC12 Fi}


void  S1486C1 ::v1(){vfunc_called(this, "_ZN7S1486C12v1Ev");}
void  S1486C1 ::v2(){vfunc_called(this, "_ZN7S1486C12v2Ev");}
void  S1486C1 ::v3(){vfunc_called(this, "_ZN7S1486C12v3Ev");}
void  S1486C1 ::v4(){vfunc_called(this, "_ZN7S1486C12v4Ev");}
S1486C1 ::~S1486C1(){ note_dtor("S1486C1", this);} // tgen
S1486C1 ::S1486C1(){ note_ctor("S1486C1", this);} // tgen

static void Test_S1486C1()
{
  extern Class_Descriptor cd_S1486C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(64,97)];
    init_test(&cd_S1486C1, buf);
    S1486C1 *dp, &lv = *(dp=new (buf) S1486C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(504,384), "sizeof(S1486C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1486C1)");
    check_base_class_offset(lv, (S1486C4*)(S1486C3*)(S1486C2*), 0, "S1486C1");
    check_base_class_offset(lv, (S1486C3*)(S1486C2*), 0, "S1486C1");
    check_base_class_offset(lv, (S1486C2*), 0, "S1486C1");
    check_field_offset(lv, s1486c1f0, ABISELECT(464,348), "S1486C1.s1486c1f0");
    check_field_offset(lv, s1486c1f1, ABISELECT(472,356), "S1486C1.s1486c1f1");
    check_field_offset(lv, s1486c1f2, ABISELECT(480,364), "S1486C1.s1486c1f2");
    check_field_offset(lv, s1486c1f3, ABISELECT(496,380), "S1486C1.s1486c1f3");
    test_class_info(&lv, &cd_S1486C1);
    dp->~S1486C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1486C1(Test_S1486C1, "S1486C1", ABISELECT(504,384));

#else // __cplusplus

extern void _ZN7S1486C1C1Ev();
extern void _ZN7S1486C1D1Ev();
Name_Map name_map_S1486C1[] = {
  NSPAIR(_ZN7S1486C1C1Ev),
  NSPAIR(_ZN7S1486C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1486C4;
extern VTBL_ENTRY _ZTI7S1486C4[];
extern  VTBL_ENTRY _ZTV7S1486C4[];
extern Class_Descriptor cd_S1486C3;
extern VTBL_ENTRY _ZTI7S1486C3[];
extern  VTBL_ENTRY _ZTV7S1486C3[];
extern Class_Descriptor cd_S1486C2;
extern VTBL_ENTRY _ZTI7S1486C2[];
extern  VTBL_ENTRY _ZTV7S1486C2[];
static Base_Class bases_S1486C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1486C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1486C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1486C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1486C1[];
extern void _ZN7S1486C1D1Ev();
extern void _ZN7S1486C1D0Ev();
extern void _ZN7S1486C42v5Ev();
extern void _ZN7S1486C42v6Ev();
extern void _ZN7S1486C42v7Ev();
extern void _ZN7S1486C42v8Ev();
extern void _ZN7S1486C42v9Ev();
extern void _ZN7S1486C43v10Ev();
extern void _ZN7S1486C43v11Ev();
extern void _ZN7S1486C43v12Ev();
extern void _ZN7S1486C43v13Ev();
extern void _ZN7S1486C43v14Ev();
extern void _ZN7S1486C33v15Ev();
extern void _ZN7S1486C33v16Ev();
extern void _ZN7S1486C33v17Ev();
extern void _ZN7S1486C33v18Ev();
extern void _ZN7S1486C33v19Ev();
extern void _ZN7S1486C33v20Ev();
extern void _ZN7S1486C33v21Ev();
extern void _ZN7S1486C33v22Ev();
extern void _ZN7S1486C33v23Ev();
extern void _ZN7S1486C33v24Ev();
extern void _ZN7S1486C33v25Ev();
extern void _ZN7S1486C33v26Ev();
extern void _ZN7S1486C33v27Ev();
extern void _ZN7S1486C33v28Ev();
extern void _ZN7S1486C23v29Ev();
extern void _ZN7S1486C23v30Ev();
extern void _ZN7S1486C23v31Ev();
extern void _ZN7S1486C23v32Ev();
extern void _ZN7S1486C12v1Ev();
extern void _ZN7S1486C12v2Ev();
extern void _ZN7S1486C12v3Ev();
extern void _ZN7S1486C12v4Ev();
static  VTBL_ENTRY vtc_S1486C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1486C1[0]),
  (VTBL_ENTRY)&_ZN7S1486C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1486C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1486C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1486C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1486C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1486C23v32Ev,
  (VTBL_ENTRY)&_ZN7S1486C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1486C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1486C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1486C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1486C1[];
extern  VTBL_ENTRY _ZTV7S1486C1[];
Class_Descriptor cd_S1486C1 = {  "S1486C1", // class name
  bases_S1486C1, 3,
  &(vtc_S1486C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(504,384), // object size
  NSPAIRA(_ZTI7S1486C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1486C1),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1487C4  {
  void *s1487c4f0[2];
  ::S10103C13_nt s1487c4f1;
  void *s1487c4f2;
  virtual  ~S1487C4(); // _ZN7S1487C4D1Ev
  virtual void  v5(); // _ZN7S1487C42v5Ev
  virtual void  v6(); // _ZN7S1487C42v6Ev
  virtual void  v7(); // _ZN7S1487C42v7Ev
  virtual void  v8(); // _ZN7S1487C42v8Ev
  virtual void  v9(); // _ZN7S1487C42v9Ev
  virtual void  v10(); // _ZN7S1487C43v10Ev
  virtual void  v11(); // _ZN7S1487C43v11Ev
  virtual void  v12(); // _ZN7S1487C43v12Ev
  virtual void  v13(); // _ZN7S1487C43v13Ev
  virtual void  v14(); // _ZN7S1487C43v14Ev
  S1487C4(); // tgen
};
//SIG(-1 S1487C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1487C4 ::~S1487C4(){ note_dtor("S1487C4", this);}
void  S1487C4 ::v5(){vfunc_called(this, "_ZN7S1487C42v5Ev");}
void  S1487C4 ::v6(){vfunc_called(this, "_ZN7S1487C42v6Ev");}
void  S1487C4 ::v7(){vfunc_called(this, "_ZN7S1487C42v7Ev");}
void  S1487C4 ::v8(){vfunc_called(this, "_ZN7S1487C42v8Ev");}
void  S1487C4 ::v9(){vfunc_called(this, "_ZN7S1487C42v9Ev");}
void  S1487C4 ::v10(){vfunc_called(this, "_ZN7S1487C43v10Ev");}
void  S1487C4 ::v11(){vfunc_called(this, "_ZN7S1487C43v11Ev");}
void  S1487C4 ::v12(){vfunc_called(this, "_ZN7S1487C43v12Ev");}
void  S1487C4 ::v13(){vfunc_called(this, "_ZN7S1487C43v13Ev");}
void  S1487C4 ::v14(){vfunc_called(this, "_ZN7S1487C43v14Ev");}
S1487C4 ::S1487C4(){ note_ctor("S1487C4", this);} // tgen

static void Test_S1487C4()
{
  extern Class_Descriptor cd_S1487C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1487C4, buf);
    S1487C4 *dp, &lv = *(dp=new (buf) S1487C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1487C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1487C4)");
    check_field_offset(lv, s1487c4f0, ABISELECT(8,4), "S1487C4.s1487c4f0");
    check_field_offset(lv, s1487c4f1, ABISELECT(24,12), "S1487C4.s1487c4f1");
    check_field_offset(lv, s1487c4f2, ABISELECT(48,28), "S1487C4.s1487c4f2");
    test_class_info(&lv, &cd_S1487C4);
    dp->~S1487C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1487C4(Test_S1487C4, "S1487C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1487C4C1Ev();
extern void _ZN7S1487C4D1Ev();
Name_Map name_map_S1487C4[] = {
  NSPAIR(_ZN7S1487C4C1Ev),
  NSPAIR(_ZN7S1487C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1487C4[];
extern void _ZN7S1487C4D1Ev();
extern void _ZN7S1487C4D0Ev();
extern void _ZN7S1487C42v5Ev();
extern void _ZN7S1487C42v6Ev();
extern void _ZN7S1487C42v7Ev();
extern void _ZN7S1487C42v8Ev();
extern void _ZN7S1487C42v9Ev();
extern void _ZN7S1487C43v10Ev();
extern void _ZN7S1487C43v11Ev();
extern void _ZN7S1487C43v12Ev();
extern void _ZN7S1487C43v13Ev();
extern void _ZN7S1487C43v14Ev();
static  VTBL_ENTRY vtc_S1487C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1487C4[0]),
  (VTBL_ENTRY)&_ZN7S1487C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1487C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1487C4[];
extern  VTBL_ENTRY _ZTV7S1487C4[];
Class_Descriptor cd_S1487C4 = {  "S1487C4", // class name
  0,0,//no base classes
  &(vtc_S1487C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1487C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1487C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1487C3  : S1487C4 {
  ::S10103C86 s1487c3f0;
  ::S10103C106 s1487c3f1;
  ::S10103C82_nt s1487c3f2;
  ::S10103C13_nt s1487c3f3;
  virtual  ~S1487C3(); // _ZN7S1487C3D1Ev
  virtual void  v15(); // _ZN7S1487C33v15Ev
  virtual void  v16(); // _ZN7S1487C33v16Ev
  virtual void  v17(); // _ZN7S1487C33v17Ev
  virtual void  v18(); // _ZN7S1487C33v18Ev
  virtual void  v19(); // _ZN7S1487C33v19Ev
  virtual void  v20(); // _ZN7S1487C33v20Ev
  virtual void  v21(); // _ZN7S1487C33v21Ev
  virtual void  v22(); // _ZN7S1487C33v22Ev
  virtual void  v23(); // _ZN7S1487C33v23Ev
  virtual void  v24(); // _ZN7S1487C33v24Ev
  virtual void  v25(); // _ZN7S1487C33v25Ev
  virtual void  v26(); // _ZN7S1487C33v26Ev
  virtual void  v27(); // _ZN7S1487C33v27Ev
  virtual void  v28(); // _ZN7S1487C33v28Ev
  S1487C3(); // tgen
};
//SIG(-1 S1487C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1487C3 ::~S1487C3(){ note_dtor("S1487C3", this);}
void  S1487C3 ::v15(){vfunc_called(this, "_ZN7S1487C33v15Ev");}
void  S1487C3 ::v16(){vfunc_called(this, "_ZN7S1487C33v16Ev");}
void  S1487C3 ::v17(){vfunc_called(this, "_ZN7S1487C33v17Ev");}
void  S1487C3 ::v18(){vfunc_called(this, "_ZN7S1487C33v18Ev");}
void  S1487C3 ::v19(){vfunc_called(this, "_ZN7S1487C33v19Ev");}
void  S1487C3 ::v20(){vfunc_called(this, "_ZN7S1487C33v20Ev");}
void  S1487C3 ::v21(){vfunc_called(this, "_ZN7S1487C33v21Ev");}
void  S1487C3 ::v22(){vfunc_called(this, "_ZN7S1487C33v22Ev");}
void  S1487C3 ::v23(){vfunc_called(this, "_ZN7S1487C33v23Ev");}
void  S1487C3 ::v24(){vfunc_called(this, "_ZN7S1487C33v24Ev");}
void  S1487C3 ::v25(){vfunc_called(this, "_ZN7S1487C33v25Ev");}
void  S1487C3 ::v26(){vfunc_called(this, "_ZN7S1487C33v26Ev");}
void  S1487C3 ::v27(){vfunc_called(this, "_ZN7S1487C33v27Ev");}
void  S1487C3 ::v28(){vfunc_called(this, "_ZN7S1487C33v28Ev");}
S1487C3 ::S1487C3(){ note_ctor("S1487C3", this);} // tgen

static void Test_S1487C3()
{
  extern Class_Descriptor cd_S1487C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1487C3, buf);
    S1487C3 *dp, &lv = *(dp=new (buf) S1487C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1487C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1487C3)");
    check_base_class_offset(lv, (S1487C4*), 0, "S1487C3");
    check_field_offset(lv, s1487c3f0, ABISELECT(56,32), "S1487C3.s1487c3f0");
    check_field_offset(lv, s1487c3f1, ABISELECT(72,44), "S1487C3.s1487c3f1");
    check_field_offset(lv, s1487c3f2, ABISELECT(96,60), "S1487C3.s1487c3f2");
    check_field_offset(lv, s1487c3f3, ABISELECT(112,76), "S1487C3.s1487c3f3");
    test_class_info(&lv, &cd_S1487C3);
    dp->~S1487C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1487C3(Test_S1487C3, "S1487C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1487C3C1Ev();
extern void _ZN7S1487C3D1Ev();
Name_Map name_map_S1487C3[] = {
  NSPAIR(_ZN7S1487C3C1Ev),
  NSPAIR(_ZN7S1487C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1487C4;
extern VTBL_ENTRY _ZTI7S1487C4[];
extern  VTBL_ENTRY _ZTV7S1487C4[];
static Base_Class bases_S1487C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1487C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1487C3[];
extern void _ZN7S1487C3D1Ev();
extern void _ZN7S1487C3D0Ev();
extern void _ZN7S1487C42v5Ev();
extern void _ZN7S1487C42v6Ev();
extern void _ZN7S1487C42v7Ev();
extern void _ZN7S1487C42v8Ev();
extern void _ZN7S1487C42v9Ev();
extern void _ZN7S1487C43v10Ev();
extern void _ZN7S1487C43v11Ev();
extern void _ZN7S1487C43v12Ev();
extern void _ZN7S1487C43v13Ev();
extern void _ZN7S1487C43v14Ev();
extern void _ZN7S1487C33v15Ev();
extern void _ZN7S1487C33v16Ev();
extern void _ZN7S1487C33v17Ev();
extern void _ZN7S1487C33v18Ev();
extern void _ZN7S1487C33v19Ev();
extern void _ZN7S1487C33v20Ev();
extern void _ZN7S1487C33v21Ev();
extern void _ZN7S1487C33v22Ev();
extern void _ZN7S1487C33v23Ev();
extern void _ZN7S1487C33v24Ev();
extern void _ZN7S1487C33v25Ev();
extern void _ZN7S1487C33v26Ev();
extern void _ZN7S1487C33v27Ev();
extern void _ZN7S1487C33v28Ev();
static  VTBL_ENTRY vtc_S1487C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1487C3[0]),
  (VTBL_ENTRY)&_ZN7S1487C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1487C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v28Ev,
};
extern VTBL_ENTRY _ZTI7S1487C3[];
extern  VTBL_ENTRY _ZTV7S1487C3[];
Class_Descriptor cd_S1487C3 = {  "S1487C3", // class name
  bases_S1487C3, 1,
  &(vtc_S1487C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1487C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1487C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1487C2  : S1487C3 {
  int s1487c2f0;
  char s1487c2f1[2];
  int s1487c2f2;
  virtual void  v29(); // _ZN7S1487C23v29Ev
  virtual void  v30(); // _ZN7S1487C23v30Ev
  virtual void  v31(); // _ZN7S1487C23v31Ev
  virtual void  v32(); // _ZN7S1487C23v32Ev
  ~S1487C2(); // tgen
  S1487C2(); // tgen
};
//SIG(-1 S1487C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 Fi Fc[2] Fi}


void  S1487C2 ::v29(){vfunc_called(this, "_ZN7S1487C23v29Ev");}
void  S1487C2 ::v30(){vfunc_called(this, "_ZN7S1487C23v30Ev");}
void  S1487C2 ::v31(){vfunc_called(this, "_ZN7S1487C23v31Ev");}
void  S1487C2 ::v32(){vfunc_called(this, "_ZN7S1487C23v32Ev");}
S1487C2 ::~S1487C2(){ note_dtor("S1487C2", this);} // tgen
S1487C2 ::S1487C2(){ note_ctor("S1487C2", this);} // tgen

static void Test_S1487C2()
{
  extern Class_Descriptor cd_S1487C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S1487C2, buf);
    S1487C2 *dp, &lv = *(dp=new (buf) S1487C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S1487C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1487C2)");
    check_base_class_offset(lv, (S1487C4*)(S1487C3*), 0, "S1487C2");
    check_base_class_offset(lv, (S1487C3*), 0, "S1487C2");
    check_field_offset(lv, s1487c2f0, ABISELECT(136,92), "S1487C2.s1487c2f0");
    check_field_offset(lv, s1487c2f1, ABISELECT(140,96), "S1487C2.s1487c2f1");
    check_field_offset(lv, s1487c2f2, ABISELECT(144,100), "S1487C2.s1487c2f2");
    test_class_info(&lv, &cd_S1487C2);
    dp->~S1487C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1487C2(Test_S1487C2, "S1487C2", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN7S1487C2C1Ev();
extern void _ZN7S1487C2D1Ev();
Name_Map name_map_S1487C2[] = {
  NSPAIR(_ZN7S1487C2C1Ev),
  NSPAIR(_ZN7S1487C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1487C4;
extern VTBL_ENTRY _ZTI7S1487C4[];
extern  VTBL_ENTRY _ZTV7S1487C4[];
extern Class_Descriptor cd_S1487C3;
extern VTBL_ENTRY _ZTI7S1487C3[];
extern  VTBL_ENTRY _ZTV7S1487C3[];
static Base_Class bases_S1487C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1487C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1487C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1487C2[];
extern void _ZN7S1487C2D1Ev();
extern void _ZN7S1487C2D0Ev();
extern void _ZN7S1487C42v5Ev();
extern void _ZN7S1487C42v6Ev();
extern void _ZN7S1487C42v7Ev();
extern void _ZN7S1487C42v8Ev();
extern void _ZN7S1487C42v9Ev();
extern void _ZN7S1487C43v10Ev();
extern void _ZN7S1487C43v11Ev();
extern void _ZN7S1487C43v12Ev();
extern void _ZN7S1487C43v13Ev();
extern void _ZN7S1487C43v14Ev();
extern void _ZN7S1487C33v15Ev();
extern void _ZN7S1487C33v16Ev();
extern void _ZN7S1487C33v17Ev();
extern void _ZN7S1487C33v18Ev();
extern void _ZN7S1487C33v19Ev();
extern void _ZN7S1487C33v20Ev();
extern void _ZN7S1487C33v21Ev();
extern void _ZN7S1487C33v22Ev();
extern void _ZN7S1487C33v23Ev();
extern void _ZN7S1487C33v24Ev();
extern void _ZN7S1487C33v25Ev();
extern void _ZN7S1487C33v26Ev();
extern void _ZN7S1487C33v27Ev();
extern void _ZN7S1487C33v28Ev();
extern void _ZN7S1487C23v29Ev();
extern void _ZN7S1487C23v30Ev();
extern void _ZN7S1487C23v31Ev();
extern void _ZN7S1487C23v32Ev();
static  VTBL_ENTRY vtc_S1487C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1487C2[0]),
  (VTBL_ENTRY)&_ZN7S1487C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1487C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v32Ev,
};
extern VTBL_ENTRY _ZTI7S1487C2[];
extern  VTBL_ENTRY _ZTV7S1487C2[];
Class_Descriptor cd_S1487C2 = {  "S1487C2", // class name
  bases_S1487C2, 2,
  &(vtc_S1487C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI7S1487C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1487C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1487C1  : S1487C2 {
  ::S10103C84 s1487c1f0;
  ::S10103C84 s1487c1f1;
  int s1487c1f2;
  void *s1487c1f3;
  int s1487c1f4[2];
  virtual  ~S1487C1(); // _ZN7S1487C1D1Ev
  virtual void  v1(); // _ZN7S1487C12v1Ev
  virtual void  v2(); // _ZN7S1487C12v2Ev
  virtual void  v3(); // _ZN7S1487C12v3Ev
  virtual void  v4(); // _ZN7S1487C12v4Ev
  S1487C1(); // tgen
};
//SIG(1 S1487C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 Fi Fc[2] Fi} vd v1 v2 v3 v4 FC14{ BC15{ BC16{ vd v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 Fp[2] FC5 Fp} vd v47 v48 v49 v50 v51 v52 Fp Fi FC8 FC12 Fi} vd v33 v34 v35 v36 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC14 Fi Fp Fi[2]}


 S1487C1 ::~S1487C1(){ note_dtor("S1487C1", this);}
void  S1487C1 ::v1(){vfunc_called(this, "_ZN7S1487C12v1Ev");}
void  S1487C1 ::v2(){vfunc_called(this, "_ZN7S1487C12v2Ev");}
void  S1487C1 ::v3(){vfunc_called(this, "_ZN7S1487C12v3Ev");}
void  S1487C1 ::v4(){vfunc_called(this, "_ZN7S1487C12v4Ev");}
S1487C1 ::S1487C1(){ note_ctor("S1487C1", this);} // tgen

static void Test_S1487C1()
{
  extern Class_Descriptor cd_S1487C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(97,143)];
    init_test(&cd_S1487C1, buf);
    S1487C1 *dp, &lv = *(dp=new (buf) S1487C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(768,568), "sizeof(S1487C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1487C1)");
    check_base_class_offset(lv, (S1487C4*)(S1487C3*)(S1487C2*), 0, "S1487C1");
    check_base_class_offset(lv, (S1487C3*)(S1487C2*), 0, "S1487C1");
    check_base_class_offset(lv, (S1487C2*), 0, "S1487C1");
    check_field_offset(lv, s1487c1f0, ABISELECT(152,104), "S1487C1.s1487c1f0");
    check_field_offset(lv, s1487c1f1, ABISELECT(448,328), "S1487C1.s1487c1f1");
    check_field_offset(lv, s1487c1f2, ABISELECT(744,552), "S1487C1.s1487c1f2");
    check_field_offset(lv, s1487c1f3, ABISELECT(752,556), "S1487C1.s1487c1f3");
    check_field_offset(lv, s1487c1f4, ABISELECT(760,560), "S1487C1.s1487c1f4");
    test_class_info(&lv, &cd_S1487C1);
    dp->~S1487C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1487C1(Test_S1487C1, "S1487C1", ABISELECT(768,568));

#else // __cplusplus

extern void _ZN7S1487C1C1Ev();
extern void _ZN7S1487C1D1Ev();
Name_Map name_map_S1487C1[] = {
  NSPAIR(_ZN7S1487C1C1Ev),
  NSPAIR(_ZN7S1487C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1487C4;
extern VTBL_ENTRY _ZTI7S1487C4[];
extern  VTBL_ENTRY _ZTV7S1487C4[];
extern Class_Descriptor cd_S1487C3;
extern VTBL_ENTRY _ZTI7S1487C3[];
extern  VTBL_ENTRY _ZTV7S1487C3[];
extern Class_Descriptor cd_S1487C2;
extern VTBL_ENTRY _ZTI7S1487C2[];
extern  VTBL_ENTRY _ZTV7S1487C2[];
static Base_Class bases_S1487C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1487C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1487C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1487C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1487C1[];
extern void _ZN7S1487C1D1Ev();
extern void _ZN7S1487C1D0Ev();
extern void _ZN7S1487C42v5Ev();
extern void _ZN7S1487C42v6Ev();
extern void _ZN7S1487C42v7Ev();
extern void _ZN7S1487C42v8Ev();
extern void _ZN7S1487C42v9Ev();
extern void _ZN7S1487C43v10Ev();
extern void _ZN7S1487C43v11Ev();
extern void _ZN7S1487C43v12Ev();
extern void _ZN7S1487C43v13Ev();
extern void _ZN7S1487C43v14Ev();
extern void _ZN7S1487C33v15Ev();
extern void _ZN7S1487C33v16Ev();
extern void _ZN7S1487C33v17Ev();
extern void _ZN7S1487C33v18Ev();
extern void _ZN7S1487C33v19Ev();
extern void _ZN7S1487C33v20Ev();
extern void _ZN7S1487C33v21Ev();
extern void _ZN7S1487C33v22Ev();
extern void _ZN7S1487C33v23Ev();
extern void _ZN7S1487C33v24Ev();
extern void _ZN7S1487C33v25Ev();
extern void _ZN7S1487C33v26Ev();
extern void _ZN7S1487C33v27Ev();
extern void _ZN7S1487C33v28Ev();
extern void _ZN7S1487C23v29Ev();
extern void _ZN7S1487C23v30Ev();
extern void _ZN7S1487C23v31Ev();
extern void _ZN7S1487C23v32Ev();
extern void _ZN7S1487C12v1Ev();
extern void _ZN7S1487C12v2Ev();
extern void _ZN7S1487C12v3Ev();
extern void _ZN7S1487C12v4Ev();
static  VTBL_ENTRY vtc_S1487C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1487C1[0]),
  (VTBL_ENTRY)&_ZN7S1487C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1487C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1487C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1487C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1487C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1487C23v32Ev,
  (VTBL_ENTRY)&_ZN7S1487C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1487C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1487C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1487C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1487C1[];
extern  VTBL_ENTRY _ZTV7S1487C1[];
Class_Descriptor cd_S1487C1 = {  "S1487C1", // class name
  bases_S1487C1, 3,
  &(vtc_S1487C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(768,568), // object size
  NSPAIRA(_ZTI7S1487C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1487C1),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1389C4  {
  void *s1389c4f0[2];
  ::S10103C13_nt s1389c4f1;
  void *s1389c4f2;
  virtual  ~S1389C4(); // _ZN7S1389C4D1Ev
  virtual void  v3(); // _ZN7S1389C42v3Ev
  virtual void  v4(); // _ZN7S1389C42v4Ev
  virtual void  v5(); // _ZN7S1389C42v5Ev
  virtual void  v6(); // _ZN7S1389C42v6Ev
  virtual void  v7(); // _ZN7S1389C42v7Ev
  virtual void  v8(); // _ZN7S1389C42v8Ev
  virtual void  v9(); // _ZN7S1389C42v9Ev
  virtual void  v10(); // _ZN7S1389C43v10Ev
  virtual void  v11(); // _ZN7S1389C43v11Ev
  virtual void  v12(); // _ZN7S1389C43v12Ev
  S1389C4(); // tgen
};
//SIG(-1 S1389C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1389C4 ::~S1389C4(){ note_dtor("S1389C4", this);}
void  S1389C4 ::v3(){vfunc_called(this, "_ZN7S1389C42v3Ev");}
void  S1389C4 ::v4(){vfunc_called(this, "_ZN7S1389C42v4Ev");}
void  S1389C4 ::v5(){vfunc_called(this, "_ZN7S1389C42v5Ev");}
void  S1389C4 ::v6(){vfunc_called(this, "_ZN7S1389C42v6Ev");}
void  S1389C4 ::v7(){vfunc_called(this, "_ZN7S1389C42v7Ev");}
void  S1389C4 ::v8(){vfunc_called(this, "_ZN7S1389C42v8Ev");}
void  S1389C4 ::v9(){vfunc_called(this, "_ZN7S1389C42v9Ev");}
void  S1389C4 ::v10(){vfunc_called(this, "_ZN7S1389C43v10Ev");}
void  S1389C4 ::v11(){vfunc_called(this, "_ZN7S1389C43v11Ev");}
void  S1389C4 ::v12(){vfunc_called(this, "_ZN7S1389C43v12Ev");}
S1389C4 ::S1389C4(){ note_ctor("S1389C4", this);} // tgen

static void Test_S1389C4()
{
  extern Class_Descriptor cd_S1389C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1389C4, buf);
    S1389C4 *dp, &lv = *(dp=new (buf) S1389C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1389C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1389C4)");
    check_field_offset(lv, s1389c4f0, ABISELECT(8,4), "S1389C4.s1389c4f0");
    check_field_offset(lv, s1389c4f1, ABISELECT(24,12), "S1389C4.s1389c4f1");
    check_field_offset(lv, s1389c4f2, ABISELECT(48,28), "S1389C4.s1389c4f2");
    test_class_info(&lv, &cd_S1389C4);
    dp->~S1389C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1389C4(Test_S1389C4, "S1389C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1389C4C1Ev();
extern void _ZN7S1389C4D1Ev();
Name_Map name_map_S1389C4[] = {
  NSPAIR(_ZN7S1389C4C1Ev),
  NSPAIR(_ZN7S1389C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1389C4[];
extern void _ZN7S1389C4D1Ev();
extern void _ZN7S1389C4D0Ev();
extern void _ZN7S1389C42v3Ev();
extern void _ZN7S1389C42v4Ev();
extern void _ZN7S1389C42v5Ev();
extern void _ZN7S1389C42v6Ev();
extern void _ZN7S1389C42v7Ev();
extern void _ZN7S1389C42v8Ev();
extern void _ZN7S1389C42v9Ev();
extern void _ZN7S1389C43v10Ev();
extern void _ZN7S1389C43v11Ev();
extern void _ZN7S1389C43v12Ev();
static  VTBL_ENTRY vtc_S1389C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1389C4[0]),
  (VTBL_ENTRY)&_ZN7S1389C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1389C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v12Ev,
};
extern VTBL_ENTRY _ZTI7S1389C4[];
extern  VTBL_ENTRY _ZTV7S1389C4[];
Class_Descriptor cd_S1389C4 = {  "S1389C4", // class name
  0,0,//no base classes
  &(vtc_S1389C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1389C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1389C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1389C3  : S1389C4 {
  ::S10103C86 s1389c3f0;
  ::S10103C106 s1389c3f1;
  ::S10103C82_nt s1389c3f2;
  ::S10103C13_nt s1389c3f3;
  virtual  ~S1389C3(); // _ZN7S1389C3D1Ev
  virtual void  v13(); // _ZN7S1389C33v13Ev
  virtual void  v14(); // _ZN7S1389C33v14Ev
  virtual void  v15(); // _ZN7S1389C33v15Ev
  virtual void  v16(); // _ZN7S1389C33v16Ev
  virtual void  v17(); // _ZN7S1389C33v17Ev
  virtual void  v18(); // _ZN7S1389C33v18Ev
  virtual void  v19(); // _ZN7S1389C33v19Ev
  virtual void  v20(); // _ZN7S1389C33v20Ev
  virtual void  v21(); // _ZN7S1389C33v21Ev
  virtual void  v22(); // _ZN7S1389C33v22Ev
  virtual void  v23(); // _ZN7S1389C33v23Ev
  virtual void  v24(); // _ZN7S1389C33v24Ev
  virtual void  v25(); // _ZN7S1389C33v25Ev
  virtual void  v26(); // _ZN7S1389C33v26Ev
  S1389C3(); // tgen
};
//SIG(-1 S1389C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1389C3 ::~S1389C3(){ note_dtor("S1389C3", this);}
void  S1389C3 ::v13(){vfunc_called(this, "_ZN7S1389C33v13Ev");}
void  S1389C3 ::v14(){vfunc_called(this, "_ZN7S1389C33v14Ev");}
void  S1389C3 ::v15(){vfunc_called(this, "_ZN7S1389C33v15Ev");}
void  S1389C3 ::v16(){vfunc_called(this, "_ZN7S1389C33v16Ev");}
void  S1389C3 ::v17(){vfunc_called(this, "_ZN7S1389C33v17Ev");}
void  S1389C3 ::v18(){vfunc_called(this, "_ZN7S1389C33v18Ev");}
void  S1389C3 ::v19(){vfunc_called(this, "_ZN7S1389C33v19Ev");}
void  S1389C3 ::v20(){vfunc_called(this, "_ZN7S1389C33v20Ev");}
void  S1389C3 ::v21(){vfunc_called(this, "_ZN7S1389C33v21Ev");}
void  S1389C3 ::v22(){vfunc_called(this, "_ZN7S1389C33v22Ev");}
void  S1389C3 ::v23(){vfunc_called(this, "_ZN7S1389C33v23Ev");}
void  S1389C3 ::v24(){vfunc_called(this, "_ZN7S1389C33v24Ev");}
void  S1389C3 ::v25(){vfunc_called(this, "_ZN7S1389C33v25Ev");}
void  S1389C3 ::v26(){vfunc_called(this, "_ZN7S1389C33v26Ev");}
S1389C3 ::S1389C3(){ note_ctor("S1389C3", this);} // tgen

static void Test_S1389C3()
{
  extern Class_Descriptor cd_S1389C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1389C3, buf);
    S1389C3 *dp, &lv = *(dp=new (buf) S1389C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1389C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1389C3)");
    check_base_class_offset(lv, (S1389C4*), 0, "S1389C3");
    check_field_offset(lv, s1389c3f0, ABISELECT(56,32), "S1389C3.s1389c3f0");
    check_field_offset(lv, s1389c3f1, ABISELECT(72,44), "S1389C3.s1389c3f1");
    check_field_offset(lv, s1389c3f2, ABISELECT(96,60), "S1389C3.s1389c3f2");
    check_field_offset(lv, s1389c3f3, ABISELECT(112,76), "S1389C3.s1389c3f3");
    test_class_info(&lv, &cd_S1389C3);
    dp->~S1389C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1389C3(Test_S1389C3, "S1389C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1389C3C1Ev();
extern void _ZN7S1389C3D1Ev();
Name_Map name_map_S1389C3[] = {
  NSPAIR(_ZN7S1389C3C1Ev),
  NSPAIR(_ZN7S1389C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1389C4;
extern VTBL_ENTRY _ZTI7S1389C4[];
extern  VTBL_ENTRY _ZTV7S1389C4[];
static Base_Class bases_S1389C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1389C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1389C3[];
extern void _ZN7S1389C3D1Ev();
extern void _ZN7S1389C3D0Ev();
extern void _ZN7S1389C42v3Ev();
extern void _ZN7S1389C42v4Ev();
extern void _ZN7S1389C42v5Ev();
extern void _ZN7S1389C42v6Ev();
extern void _ZN7S1389C42v7Ev();
extern void _ZN7S1389C42v8Ev();
extern void _ZN7S1389C42v9Ev();
extern void _ZN7S1389C43v10Ev();
extern void _ZN7S1389C43v11Ev();
extern void _ZN7S1389C43v12Ev();
extern void _ZN7S1389C33v13Ev();
extern void _ZN7S1389C33v14Ev();
extern void _ZN7S1389C33v15Ev();
extern void _ZN7S1389C33v16Ev();
extern void _ZN7S1389C33v17Ev();
extern void _ZN7S1389C33v18Ev();
extern void _ZN7S1389C33v19Ev();
extern void _ZN7S1389C33v20Ev();
extern void _ZN7S1389C33v21Ev();
extern void _ZN7S1389C33v22Ev();
extern void _ZN7S1389C33v23Ev();
extern void _ZN7S1389C33v24Ev();
extern void _ZN7S1389C33v25Ev();
extern void _ZN7S1389C33v26Ev();
static  VTBL_ENTRY vtc_S1389C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1389C3[0]),
  (VTBL_ENTRY)&_ZN7S1389C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1389C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v26Ev,
};
extern VTBL_ENTRY _ZTI7S1389C3[];
extern  VTBL_ENTRY _ZTV7S1389C3[];
Class_Descriptor cd_S1389C3 = {  "S1389C3", // class name
  bases_S1389C3, 1,
  &(vtc_S1389C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1389C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1389C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1389C2  : S1389C3 {
  int s1389c2f0[3];
  ::S10103C84 s1389c2f1[4];
  virtual  ~S1389C2(); // _ZN7S1389C2D1Ev
  virtual void  v27(); // _ZN7S1389C23v27Ev
  virtual void  v28(); // _ZN7S1389C23v28Ev
  virtual void  v29(); // _ZN7S1389C23v29Ev
  virtual void  v30(); // _ZN7S1389C23v30Ev
  S1389C2(); // tgen
};
//SIG(-1 S1389C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi[3] FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}[4]}


 S1389C2 ::~S1389C2(){ note_dtor("S1389C2", this);}
void  S1389C2 ::v27(){vfunc_called(this, "_ZN7S1389C23v27Ev");}
void  S1389C2 ::v28(){vfunc_called(this, "_ZN7S1389C23v28Ev");}
void  S1389C2 ::v29(){vfunc_called(this, "_ZN7S1389C23v29Ev");}
void  S1389C2 ::v30(){vfunc_called(this, "_ZN7S1389C23v30Ev");}
S1389C2 ::S1389C2(){ note_ctor("S1389C2", this);} // tgen

static void Test_S1389C2()
{
  extern Class_Descriptor cd_S1389C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(168,251)];
    init_test(&cd_S1389C2, buf);
    S1389C2 *dp, &lv = *(dp=new (buf) S1389C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1336,1000), "sizeof(S1389C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1389C2)");
    check_base_class_offset(lv, (S1389C4*)(S1389C3*), 0, "S1389C2");
    check_base_class_offset(lv, (S1389C3*), 0, "S1389C2");
    check_field_offset(lv, s1389c2f0, ABISELECT(136,92), "S1389C2.s1389c2f0");
    check_field_offset(lv, s1389c2f1, ABISELECT(152,104), "S1389C2.s1389c2f1");
    test_class_info(&lv, &cd_S1389C2);
    dp->~S1389C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1389C2(Test_S1389C2, "S1389C2", ABISELECT(1336,1000));

#else // __cplusplus

extern void _ZN7S1389C2C1Ev();
extern void _ZN7S1389C2D1Ev();
Name_Map name_map_S1389C2[] = {
  NSPAIR(_ZN7S1389C2C1Ev),
  NSPAIR(_ZN7S1389C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1389C4;
extern VTBL_ENTRY _ZTI7S1389C4[];
extern  VTBL_ENTRY _ZTV7S1389C4[];
extern Class_Descriptor cd_S1389C3;
extern VTBL_ENTRY _ZTI7S1389C3[];
extern  VTBL_ENTRY _ZTV7S1389C3[];
static Base_Class bases_S1389C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1389C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1389C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1389C2[];
extern void _ZN7S1389C2D1Ev();
extern void _ZN7S1389C2D0Ev();
extern void _ZN7S1389C42v3Ev();
extern void _ZN7S1389C42v4Ev();
extern void _ZN7S1389C42v5Ev();
extern void _ZN7S1389C42v6Ev();
extern void _ZN7S1389C42v7Ev();
extern void _ZN7S1389C42v8Ev();
extern void _ZN7S1389C42v9Ev();
extern void _ZN7S1389C43v10Ev();
extern void _ZN7S1389C43v11Ev();
extern void _ZN7S1389C43v12Ev();
extern void _ZN7S1389C33v13Ev();
extern void _ZN7S1389C33v14Ev();
extern void _ZN7S1389C33v15Ev();
extern void _ZN7S1389C33v16Ev();
extern void _ZN7S1389C33v17Ev();
extern void _ZN7S1389C33v18Ev();
extern void _ZN7S1389C33v19Ev();
extern void _ZN7S1389C33v20Ev();
extern void _ZN7S1389C33v21Ev();
extern void _ZN7S1389C33v22Ev();
extern void _ZN7S1389C33v23Ev();
extern void _ZN7S1389C33v24Ev();
extern void _ZN7S1389C33v25Ev();
extern void _ZN7S1389C33v26Ev();
extern void _ZN7S1389C23v27Ev();
extern void _ZN7S1389C23v28Ev();
extern void _ZN7S1389C23v29Ev();
extern void _ZN7S1389C23v30Ev();
static  VTBL_ENTRY vtc_S1389C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1389C2[0]),
  (VTBL_ENTRY)&_ZN7S1389C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1389C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v30Ev,
};
extern VTBL_ENTRY _ZTI7S1389C2[];
extern  VTBL_ENTRY _ZTV7S1389C2[];
Class_Descriptor cd_S1389C2 = {  "S1389C2", // class name
  bases_S1389C2, 2,
  &(vtc_S1389C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1336,1000), // object size
  NSPAIRA(_ZTI7S1389C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1389C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1389C1  : S1389C2 {
  ::S10103C84 s1389c1f0;
  virtual  ~S1389C1(); // _ZN7S1389C1D1Ev
  virtual void  v1(); // _ZN7S1389C12v1Ev
  virtual void  v2(); // _ZN7S1389C12v2Ev
  S1389C1(); // tgen
};
//SIG(1 S1389C1) C1{ BC2{ BC3{ BC4{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} vd v27 v28 v29 v30 Fi[3] FC14{ BC15{ BC16{ vd v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 Fp[2] FC5 Fp} vd v45 v46 v47 v48 v49 v50 Fp Fi FC8 FC12 Fi} vd v31 v32 v33 v34 FC5[4] FC12 FC12 FC12 FC12 Fi[6]}[4]} vd v1 v2 FC14}


 S1389C1 ::~S1389C1(){ note_dtor("S1389C1", this);}
void  S1389C1 ::v1(){vfunc_called(this, "_ZN7S1389C12v1Ev");}
void  S1389C1 ::v2(){vfunc_called(this, "_ZN7S1389C12v2Ev");}
S1389C1 ::S1389C1(){ note_ctor("S1389C1", this);} // tgen

static void Test_S1389C1()
{
  extern Class_Descriptor cd_S1389C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(205,307)];
    init_test(&cd_S1389C1, buf);
    S1389C1 *dp, &lv = *(dp=new (buf) S1389C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1632,1224), "sizeof(S1389C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1389C1)");
    check_base_class_offset(lv, (S1389C4*)(S1389C3*)(S1389C2*), 0, "S1389C1");
    check_base_class_offset(lv, (S1389C3*)(S1389C2*), 0, "S1389C1");
    check_base_class_offset(lv, (S1389C2*), 0, "S1389C1");
    check_field_offset(lv, s1389c1f0, ABISELECT(1336,1000), "S1389C1.s1389c1f0");
    test_class_info(&lv, &cd_S1389C1);
    dp->~S1389C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1389C1(Test_S1389C1, "S1389C1", ABISELECT(1632,1224));

#else // __cplusplus

extern void _ZN7S1389C1C1Ev();
extern void _ZN7S1389C1D1Ev();
Name_Map name_map_S1389C1[] = {
  NSPAIR(_ZN7S1389C1C1Ev),
  NSPAIR(_ZN7S1389C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1389C4;
extern VTBL_ENTRY _ZTI7S1389C4[];
extern  VTBL_ENTRY _ZTV7S1389C4[];
extern Class_Descriptor cd_S1389C3;
extern VTBL_ENTRY _ZTI7S1389C3[];
extern  VTBL_ENTRY _ZTV7S1389C3[];
extern Class_Descriptor cd_S1389C2;
extern VTBL_ENTRY _ZTI7S1389C2[];
extern  VTBL_ENTRY _ZTV7S1389C2[];
static Base_Class bases_S1389C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1389C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1389C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1389C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1389C1[];
extern void _ZN7S1389C1D1Ev();
extern void _ZN7S1389C1D0Ev();
extern void _ZN7S1389C42v3Ev();
extern void _ZN7S1389C42v4Ev();
extern void _ZN7S1389C42v5Ev();
extern void _ZN7S1389C42v6Ev();
extern void _ZN7S1389C42v7Ev();
extern void _ZN7S1389C42v8Ev();
extern void _ZN7S1389C42v9Ev();
extern void _ZN7S1389C43v10Ev();
extern void _ZN7S1389C43v11Ev();
extern void _ZN7S1389C43v12Ev();
extern void _ZN7S1389C33v13Ev();
extern void _ZN7S1389C33v14Ev();
extern void _ZN7S1389C33v15Ev();
extern void _ZN7S1389C33v16Ev();
extern void _ZN7S1389C33v17Ev();
extern void _ZN7S1389C33v18Ev();
extern void _ZN7S1389C33v19Ev();
extern void _ZN7S1389C33v20Ev();
extern void _ZN7S1389C33v21Ev();
extern void _ZN7S1389C33v22Ev();
extern void _ZN7S1389C33v23Ev();
extern void _ZN7S1389C33v24Ev();
extern void _ZN7S1389C33v25Ev();
extern void _ZN7S1389C33v26Ev();
extern void _ZN7S1389C23v27Ev();
extern void _ZN7S1389C23v28Ev();
extern void _ZN7S1389C23v29Ev();
extern void _ZN7S1389C23v30Ev();
extern void _ZN7S1389C12v1Ev();
extern void _ZN7S1389C12v2Ev();
static  VTBL_ENTRY vtc_S1389C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1389C1[0]),
  (VTBL_ENTRY)&_ZN7S1389C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1389C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1389C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1389C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1389C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1389C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1389C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1389C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S1389C1[];
extern  VTBL_ENTRY _ZTV7S1389C1[];
Class_Descriptor cd_S1389C1 = {  "S1389C1", // class name
  bases_S1389C1, 3,
  &(vtc_S1389C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1632,1224), // object size
  NSPAIRA(_ZTI7S1389C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1389C1),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1345C4  {
  void *s1345c4f0[2];
  ::S10103C13_nt s1345c4f1;
  void *s1345c4f2;
  virtual  ~S1345C4(); // _ZN7S1345C4D1Ev
  virtual void  v2(); // _ZN7S1345C42v2Ev
  virtual void  v3(); // _ZN7S1345C42v3Ev
  virtual void  v4(); // _ZN7S1345C42v4Ev
  virtual void  v5(); // _ZN7S1345C42v5Ev
  virtual void  v6(); // _ZN7S1345C42v6Ev
  virtual void  v7(); // _ZN7S1345C42v7Ev
  virtual void  v8(); // _ZN7S1345C42v8Ev
  virtual void  v9(); // _ZN7S1345C42v9Ev
  virtual void  v10(); // _ZN7S1345C43v10Ev
  virtual void  v11(); // _ZN7S1345C43v11Ev
  S1345C4(); // tgen
};
//SIG(-1 S1345C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1345C4 ::~S1345C4(){ note_dtor("S1345C4", this);}
void  S1345C4 ::v2(){vfunc_called(this, "_ZN7S1345C42v2Ev");}
void  S1345C4 ::v3(){vfunc_called(this, "_ZN7S1345C42v3Ev");}
void  S1345C4 ::v4(){vfunc_called(this, "_ZN7S1345C42v4Ev");}
void  S1345C4 ::v5(){vfunc_called(this, "_ZN7S1345C42v5Ev");}
void  S1345C4 ::v6(){vfunc_called(this, "_ZN7S1345C42v6Ev");}
void  S1345C4 ::v7(){vfunc_called(this, "_ZN7S1345C42v7Ev");}
void  S1345C4 ::v8(){vfunc_called(this, "_ZN7S1345C42v8Ev");}
void  S1345C4 ::v9(){vfunc_called(this, "_ZN7S1345C42v9Ev");}
void  S1345C4 ::v10(){vfunc_called(this, "_ZN7S1345C43v10Ev");}
void  S1345C4 ::v11(){vfunc_called(this, "_ZN7S1345C43v11Ev");}
S1345C4 ::S1345C4(){ note_ctor("S1345C4", this);} // tgen

static void Test_S1345C4()
{
  extern Class_Descriptor cd_S1345C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1345C4, buf);
    S1345C4 *dp, &lv = *(dp=new (buf) S1345C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1345C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1345C4)");
    check_field_offset(lv, s1345c4f0, ABISELECT(8,4), "S1345C4.s1345c4f0");
    check_field_offset(lv, s1345c4f1, ABISELECT(24,12), "S1345C4.s1345c4f1");
    check_field_offset(lv, s1345c4f2, ABISELECT(48,28), "S1345C4.s1345c4f2");
    test_class_info(&lv, &cd_S1345C4);
    dp->~S1345C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1345C4(Test_S1345C4, "S1345C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1345C4C1Ev();
extern void _ZN7S1345C4D1Ev();
Name_Map name_map_S1345C4[] = {
  NSPAIR(_ZN7S1345C4C1Ev),
  NSPAIR(_ZN7S1345C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1345C4[];
extern void _ZN7S1345C4D1Ev();
extern void _ZN7S1345C4D0Ev();
extern void _ZN7S1345C42v2Ev();
extern void _ZN7S1345C42v3Ev();
extern void _ZN7S1345C42v4Ev();
extern void _ZN7S1345C42v5Ev();
extern void _ZN7S1345C42v6Ev();
extern void _ZN7S1345C42v7Ev();
extern void _ZN7S1345C42v8Ev();
extern void _ZN7S1345C42v9Ev();
extern void _ZN7S1345C43v10Ev();
extern void _ZN7S1345C43v11Ev();
static  VTBL_ENTRY vtc_S1345C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1345C4[0]),
  (VTBL_ENTRY)&_ZN7S1345C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1345C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v11Ev,
};
extern VTBL_ENTRY _ZTI7S1345C4[];
extern  VTBL_ENTRY _ZTV7S1345C4[];
Class_Descriptor cd_S1345C4 = {  "S1345C4", // class name
  0,0,//no base classes
  &(vtc_S1345C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1345C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1345C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1345C3  : S1345C4 {
  ::S10103C86 s1345c3f0;
  ::S10103C106 s1345c3f1;
  ::S10103C82_nt s1345c3f2;
  ::S10103C13_nt s1345c3f3;
  virtual  ~S1345C3(); // _ZN7S1345C3D1Ev
  virtual void  v12(); // _ZN7S1345C33v12Ev
  virtual void  v13(); // _ZN7S1345C33v13Ev
  virtual void  v14(); // _ZN7S1345C33v14Ev
  virtual void  v15(); // _ZN7S1345C33v15Ev
  virtual void  v16(); // _ZN7S1345C33v16Ev
  virtual void  v17(); // _ZN7S1345C33v17Ev
  virtual void  v18(); // _ZN7S1345C33v18Ev
  virtual void  v19(); // _ZN7S1345C33v19Ev
  virtual void  v20(); // _ZN7S1345C33v20Ev
  virtual void  v21(); // _ZN7S1345C33v21Ev
  virtual void  v22(); // _ZN7S1345C33v22Ev
  virtual void  v23(); // _ZN7S1345C33v23Ev
  virtual void  v24(); // _ZN7S1345C33v24Ev
  virtual void  v25(); // _ZN7S1345C33v25Ev
  S1345C3(); // tgen
};
//SIG(-1 S1345C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1345C3 ::~S1345C3(){ note_dtor("S1345C3", this);}
void  S1345C3 ::v12(){vfunc_called(this, "_ZN7S1345C33v12Ev");}
void  S1345C3 ::v13(){vfunc_called(this, "_ZN7S1345C33v13Ev");}
void  S1345C3 ::v14(){vfunc_called(this, "_ZN7S1345C33v14Ev");}
void  S1345C3 ::v15(){vfunc_called(this, "_ZN7S1345C33v15Ev");}
void  S1345C3 ::v16(){vfunc_called(this, "_ZN7S1345C33v16Ev");}
void  S1345C3 ::v17(){vfunc_called(this, "_ZN7S1345C33v17Ev");}
void  S1345C3 ::v18(){vfunc_called(this, "_ZN7S1345C33v18Ev");}
void  S1345C3 ::v19(){vfunc_called(this, "_ZN7S1345C33v19Ev");}
void  S1345C3 ::v20(){vfunc_called(this, "_ZN7S1345C33v20Ev");}
void  S1345C3 ::v21(){vfunc_called(this, "_ZN7S1345C33v21Ev");}
void  S1345C3 ::v22(){vfunc_called(this, "_ZN7S1345C33v22Ev");}
void  S1345C3 ::v23(){vfunc_called(this, "_ZN7S1345C33v23Ev");}
void  S1345C3 ::v24(){vfunc_called(this, "_ZN7S1345C33v24Ev");}
void  S1345C3 ::v25(){vfunc_called(this, "_ZN7S1345C33v25Ev");}
S1345C3 ::S1345C3(){ note_ctor("S1345C3", this);} // tgen

static void Test_S1345C3()
{
  extern Class_Descriptor cd_S1345C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1345C3, buf);
    S1345C3 *dp, &lv = *(dp=new (buf) S1345C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1345C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1345C3)");
    check_base_class_offset(lv, (S1345C4*), 0, "S1345C3");
    check_field_offset(lv, s1345c3f0, ABISELECT(56,32), "S1345C3.s1345c3f0");
    check_field_offset(lv, s1345c3f1, ABISELECT(72,44), "S1345C3.s1345c3f1");
    check_field_offset(lv, s1345c3f2, ABISELECT(96,60), "S1345C3.s1345c3f2");
    check_field_offset(lv, s1345c3f3, ABISELECT(112,76), "S1345C3.s1345c3f3");
    test_class_info(&lv, &cd_S1345C3);
    dp->~S1345C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1345C3(Test_S1345C3, "S1345C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1345C3C1Ev();
extern void _ZN7S1345C3D1Ev();
Name_Map name_map_S1345C3[] = {
  NSPAIR(_ZN7S1345C3C1Ev),
  NSPAIR(_ZN7S1345C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1345C4;
extern VTBL_ENTRY _ZTI7S1345C4[];
extern  VTBL_ENTRY _ZTV7S1345C4[];
static Base_Class bases_S1345C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1345C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1345C3[];
extern void _ZN7S1345C3D1Ev();
extern void _ZN7S1345C3D0Ev();
extern void _ZN7S1345C42v2Ev();
extern void _ZN7S1345C42v3Ev();
extern void _ZN7S1345C42v4Ev();
extern void _ZN7S1345C42v5Ev();
extern void _ZN7S1345C42v6Ev();
extern void _ZN7S1345C42v7Ev();
extern void _ZN7S1345C42v8Ev();
extern void _ZN7S1345C42v9Ev();
extern void _ZN7S1345C43v10Ev();
extern void _ZN7S1345C43v11Ev();
extern void _ZN7S1345C33v12Ev();
extern void _ZN7S1345C33v13Ev();
extern void _ZN7S1345C33v14Ev();
extern void _ZN7S1345C33v15Ev();
extern void _ZN7S1345C33v16Ev();
extern void _ZN7S1345C33v17Ev();
extern void _ZN7S1345C33v18Ev();
extern void _ZN7S1345C33v19Ev();
extern void _ZN7S1345C33v20Ev();
extern void _ZN7S1345C33v21Ev();
extern void _ZN7S1345C33v22Ev();
extern void _ZN7S1345C33v23Ev();
extern void _ZN7S1345C33v24Ev();
extern void _ZN7S1345C33v25Ev();
static  VTBL_ENTRY vtc_S1345C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1345C3[0]),
  (VTBL_ENTRY)&_ZN7S1345C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1345C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v25Ev,
};
extern VTBL_ENTRY _ZTI7S1345C3[];
extern  VTBL_ENTRY _ZTV7S1345C3[];
Class_Descriptor cd_S1345C3 = {  "S1345C3", // class name
  bases_S1345C3, 1,
  &(vtc_S1345C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1345C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1345C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1345C2  : S1345C3 {
  ::S10103C84 s1345c2f0;
  ::S10103C82_nt s1345c2f1;
  ::S10103C82_nt s1345c2f2;
  virtual void  v26(); // _ZN7S1345C23v26Ev
  virtual void  v27(); // _ZN7S1345C23v27Ev
  virtual void  v28(); // _ZN7S1345C23v28Ev
  virtual void  v29(); // _ZN7S1345C23v29Ev
  ~S1345C2(); // tgen
  S1345C2(); // tgen
};
//SIG(-1 S1345C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]} FC11 FC11}


void  S1345C2 ::v26(){vfunc_called(this, "_ZN7S1345C23v26Ev");}
void  S1345C2 ::v27(){vfunc_called(this, "_ZN7S1345C23v27Ev");}
void  S1345C2 ::v28(){vfunc_called(this, "_ZN7S1345C23v28Ev");}
void  S1345C2 ::v29(){vfunc_called(this, "_ZN7S1345C23v29Ev");}
S1345C2 ::~S1345C2(){ note_dtor("S1345C2", this);} // tgen
S1345C2 ::S1345C2(){ note_ctor("S1345C2", this);} // tgen

static void Test_S1345C2()
{
  extern Class_Descriptor cd_S1345C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(59,88)];
    init_test(&cd_S1345C2, buf);
    S1345C2 *dp, &lv = *(dp=new (buf) S1345C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(464,348), "sizeof(S1345C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1345C2)");
    check_base_class_offset(lv, (S1345C4*)(S1345C3*), 0, "S1345C2");
    check_base_class_offset(lv, (S1345C3*), 0, "S1345C2");
    check_field_offset(lv, s1345c2f0, ABISELECT(136,92), "S1345C2.s1345c2f0");
    check_field_offset(lv, s1345c2f1, ABISELECT(432,316), "S1345C2.s1345c2f1");
    check_field_offset(lv, s1345c2f2, ABISELECT(448,332), "S1345C2.s1345c2f2");
    test_class_info(&lv, &cd_S1345C2);
    dp->~S1345C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1345C2(Test_S1345C2, "S1345C2", ABISELECT(464,348));

#else // __cplusplus

extern void _ZN7S1345C2C1Ev();
extern void _ZN7S1345C2D1Ev();
Name_Map name_map_S1345C2[] = {
  NSPAIR(_ZN7S1345C2C1Ev),
  NSPAIR(_ZN7S1345C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1345C4;
extern VTBL_ENTRY _ZTI7S1345C4[];
extern  VTBL_ENTRY _ZTV7S1345C4[];
extern Class_Descriptor cd_S1345C3;
extern VTBL_ENTRY _ZTI7S1345C3[];
extern  VTBL_ENTRY _ZTV7S1345C3[];
static Base_Class bases_S1345C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1345C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1345C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1345C2[];
extern void _ZN7S1345C2D1Ev();
extern void _ZN7S1345C2D0Ev();
extern void _ZN7S1345C42v2Ev();
extern void _ZN7S1345C42v3Ev();
extern void _ZN7S1345C42v4Ev();
extern void _ZN7S1345C42v5Ev();
extern void _ZN7S1345C42v6Ev();
extern void _ZN7S1345C42v7Ev();
extern void _ZN7S1345C42v8Ev();
extern void _ZN7S1345C42v9Ev();
extern void _ZN7S1345C43v10Ev();
extern void _ZN7S1345C43v11Ev();
extern void _ZN7S1345C33v12Ev();
extern void _ZN7S1345C33v13Ev();
extern void _ZN7S1345C33v14Ev();
extern void _ZN7S1345C33v15Ev();
extern void _ZN7S1345C33v16Ev();
extern void _ZN7S1345C33v17Ev();
extern void _ZN7S1345C33v18Ev();
extern void _ZN7S1345C33v19Ev();
extern void _ZN7S1345C33v20Ev();
extern void _ZN7S1345C33v21Ev();
extern void _ZN7S1345C33v22Ev();
extern void _ZN7S1345C33v23Ev();
extern void _ZN7S1345C33v24Ev();
extern void _ZN7S1345C33v25Ev();
extern void _ZN7S1345C23v26Ev();
extern void _ZN7S1345C23v27Ev();
extern void _ZN7S1345C23v28Ev();
extern void _ZN7S1345C23v29Ev();
static  VTBL_ENTRY vtc_S1345C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1345C2[0]),
  (VTBL_ENTRY)&_ZN7S1345C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1345C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v26Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v29Ev,
};
extern VTBL_ENTRY _ZTI7S1345C2[];
extern  VTBL_ENTRY _ZTV7S1345C2[];
Class_Descriptor cd_S1345C2 = {  "S1345C2", // class name
  bases_S1345C2, 2,
  &(vtc_S1345C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(464,348), // object size
  NSPAIRA(_ZTI7S1345C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1345C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1345C1  : S1345C2 {
  virtual void  v1(); // _ZN7S1345C12v1Ev
  ~S1345C1(); // tgen
  S1345C1(); // tgen
};
//SIG(1 S1345C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v26 v27 v28 v29 FC14{ BC15{ BC16{ vd v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 Fp[2] FC5 Fp} vd v44 v45 v46 v47 v48 v49 Fp Fi FC8 FC12 Fi} vd v30 v31 v32 v33 FC5[4] FC12 FC12 FC12 FC12 Fi[6]} FC12 FC12} v1}


void  S1345C1 ::v1(){vfunc_called(this, "_ZN7S1345C12v1Ev");}
S1345C1 ::~S1345C1(){ note_dtor("S1345C1", this);} // tgen
S1345C1 ::S1345C1(){ note_ctor("S1345C1", this);} // tgen

static void Test_S1345C1()
{
  extern Class_Descriptor cd_S1345C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(59,88)];
    init_test(&cd_S1345C1, buf);
    S1345C1 *dp, &lv = *(dp=new (buf) S1345C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(464,348), "sizeof(S1345C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1345C1)");
    check_base_class_offset(lv, (S1345C4*)(S1345C3*)(S1345C2*), 0, "S1345C1");
    check_base_class_offset(lv, (S1345C3*)(S1345C2*), 0, "S1345C1");
    check_base_class_offset(lv, (S1345C2*), 0, "S1345C1");
    test_class_info(&lv, &cd_S1345C1);
    dp->~S1345C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1345C1(Test_S1345C1, "S1345C1", ABISELECT(464,348));

#else // __cplusplus

extern void _ZN7S1345C1C1Ev();
extern void _ZN7S1345C1D1Ev();
Name_Map name_map_S1345C1[] = {
  NSPAIR(_ZN7S1345C1C1Ev),
  NSPAIR(_ZN7S1345C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1345C4;
extern VTBL_ENTRY _ZTI7S1345C4[];
extern  VTBL_ENTRY _ZTV7S1345C4[];
extern Class_Descriptor cd_S1345C3;
extern VTBL_ENTRY _ZTI7S1345C3[];
extern  VTBL_ENTRY _ZTV7S1345C3[];
extern Class_Descriptor cd_S1345C2;
extern VTBL_ENTRY _ZTI7S1345C2[];
extern  VTBL_ENTRY _ZTV7S1345C2[];
static Base_Class bases_S1345C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1345C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1345C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1345C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1345C1[];
extern void _ZN7S1345C1D1Ev();
extern void _ZN7S1345C1D0Ev();
extern void _ZN7S1345C42v2Ev();
extern void _ZN7S1345C42v3Ev();
extern void _ZN7S1345C42v4Ev();
extern void _ZN7S1345C42v5Ev();
extern void _ZN7S1345C42v6Ev();
extern void _ZN7S1345C42v7Ev();
extern void _ZN7S1345C42v8Ev();
extern void _ZN7S1345C42v9Ev();
extern void _ZN7S1345C43v10Ev();
extern void _ZN7S1345C43v11Ev();
extern void _ZN7S1345C33v12Ev();
extern void _ZN7S1345C33v13Ev();
extern void _ZN7S1345C33v14Ev();
extern void _ZN7S1345C33v15Ev();
extern void _ZN7S1345C33v16Ev();
extern void _ZN7S1345C33v17Ev();
extern void _ZN7S1345C33v18Ev();
extern void _ZN7S1345C33v19Ev();
extern void _ZN7S1345C33v20Ev();
extern void _ZN7S1345C33v21Ev();
extern void _ZN7S1345C33v22Ev();
extern void _ZN7S1345C33v23Ev();
extern void _ZN7S1345C33v24Ev();
extern void _ZN7S1345C33v25Ev();
extern void _ZN7S1345C23v26Ev();
extern void _ZN7S1345C23v27Ev();
extern void _ZN7S1345C23v28Ev();
extern void _ZN7S1345C23v29Ev();
extern void _ZN7S1345C12v1Ev();
static  VTBL_ENTRY vtc_S1345C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1345C1[0]),
  (VTBL_ENTRY)&_ZN7S1345C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1345C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1345C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1345C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1345C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v26Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v28Ev,
  (VTBL_ENTRY)&_ZN7S1345C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1345C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S1345C1[];
extern  VTBL_ENTRY _ZTV7S1345C1[];
Class_Descriptor cd_S1345C1 = {  "S1345C1", // class name
  bases_S1345C1, 3,
  &(vtc_S1345C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(464,348), // object size
  NSPAIRA(_ZTI7S1345C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1345C1),33, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1387C4  {
  void *s1387c4f0[2];
  ::S10103C13_nt s1387c4f1;
  void *s1387c4f2;
  virtual  ~S1387C4(); // _ZN7S1387C4D1Ev
  virtual void  v3(); // _ZN7S1387C42v3Ev
  virtual void  v4(); // _ZN7S1387C42v4Ev
  virtual void  v5(); // _ZN7S1387C42v5Ev
  virtual void  v6(); // _ZN7S1387C42v6Ev
  virtual void  v7(); // _ZN7S1387C42v7Ev
  virtual void  v8(); // _ZN7S1387C42v8Ev
  virtual void  v9(); // _ZN7S1387C42v9Ev
  virtual void  v10(); // _ZN7S1387C43v10Ev
  virtual void  v11(); // _ZN7S1387C43v11Ev
  virtual void  v12(); // _ZN7S1387C43v12Ev
  S1387C4(); // tgen
};
//SIG(-1 S1387C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1387C4 ::~S1387C4(){ note_dtor("S1387C4", this);}
void  S1387C4 ::v3(){vfunc_called(this, "_ZN7S1387C42v3Ev");}
void  S1387C4 ::v4(){vfunc_called(this, "_ZN7S1387C42v4Ev");}
void  S1387C4 ::v5(){vfunc_called(this, "_ZN7S1387C42v5Ev");}
void  S1387C4 ::v6(){vfunc_called(this, "_ZN7S1387C42v6Ev");}
void  S1387C4 ::v7(){vfunc_called(this, "_ZN7S1387C42v7Ev");}
void  S1387C4 ::v8(){vfunc_called(this, "_ZN7S1387C42v8Ev");}
void  S1387C4 ::v9(){vfunc_called(this, "_ZN7S1387C42v9Ev");}
void  S1387C4 ::v10(){vfunc_called(this, "_ZN7S1387C43v10Ev");}
void  S1387C4 ::v11(){vfunc_called(this, "_ZN7S1387C43v11Ev");}
void  S1387C4 ::v12(){vfunc_called(this, "_ZN7S1387C43v12Ev");}
S1387C4 ::S1387C4(){ note_ctor("S1387C4", this);} // tgen

static void Test_S1387C4()
{
  extern Class_Descriptor cd_S1387C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1387C4, buf);
    S1387C4 *dp, &lv = *(dp=new (buf) S1387C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1387C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1387C4)");
    check_field_offset(lv, s1387c4f0, ABISELECT(8,4), "S1387C4.s1387c4f0");
    check_field_offset(lv, s1387c4f1, ABISELECT(24,12), "S1387C4.s1387c4f1");
    check_field_offset(lv, s1387c4f2, ABISELECT(48,28), "S1387C4.s1387c4f2");
    test_class_info(&lv, &cd_S1387C4);
    dp->~S1387C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1387C4(Test_S1387C4, "S1387C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1387C4C1Ev();
extern void _ZN7S1387C4D1Ev();
Name_Map name_map_S1387C4[] = {
  NSPAIR(_ZN7S1387C4C1Ev),
  NSPAIR(_ZN7S1387C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1387C4[];
extern void _ZN7S1387C4D1Ev();
extern void _ZN7S1387C4D0Ev();
extern void _ZN7S1387C42v3Ev();
extern void _ZN7S1387C42v4Ev();
extern void _ZN7S1387C42v5Ev();
extern void _ZN7S1387C42v6Ev();
extern void _ZN7S1387C42v7Ev();
extern void _ZN7S1387C42v8Ev();
extern void _ZN7S1387C42v9Ev();
extern void _ZN7S1387C43v10Ev();
extern void _ZN7S1387C43v11Ev();
extern void _ZN7S1387C43v12Ev();
static  VTBL_ENTRY vtc_S1387C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1387C4[0]),
  (VTBL_ENTRY)&_ZN7S1387C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1387C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v12Ev,
};
extern VTBL_ENTRY _ZTI7S1387C4[];
extern  VTBL_ENTRY _ZTV7S1387C4[];
Class_Descriptor cd_S1387C4 = {  "S1387C4", // class name
  0,0,//no base classes
  &(vtc_S1387C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1387C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1387C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1387C3  : S1387C4 {
  ::S10103C86 s1387c3f0;
  ::S10103C106 s1387c3f1;
  ::S10103C82_nt s1387c3f2;
  ::S10103C13_nt s1387c3f3;
  virtual  ~S1387C3(); // _ZN7S1387C3D1Ev
  virtual void  v13(); // _ZN7S1387C33v13Ev
  virtual void  v14(); // _ZN7S1387C33v14Ev
  virtual void  v15(); // _ZN7S1387C33v15Ev
  virtual void  v16(); // _ZN7S1387C33v16Ev
  virtual void  v17(); // _ZN7S1387C33v17Ev
  virtual void  v18(); // _ZN7S1387C33v18Ev
  virtual void  v19(); // _ZN7S1387C33v19Ev
  virtual void  v20(); // _ZN7S1387C33v20Ev
  virtual void  v21(); // _ZN7S1387C33v21Ev
  virtual void  v22(); // _ZN7S1387C33v22Ev
  virtual void  v23(); // _ZN7S1387C33v23Ev
  virtual void  v24(); // _ZN7S1387C33v24Ev
  virtual void  v25(); // _ZN7S1387C33v25Ev
  virtual void  v26(); // _ZN7S1387C33v26Ev
  S1387C3(); // tgen
};
//SIG(-1 S1387C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1387C3 ::~S1387C3(){ note_dtor("S1387C3", this);}
void  S1387C3 ::v13(){vfunc_called(this, "_ZN7S1387C33v13Ev");}
void  S1387C3 ::v14(){vfunc_called(this, "_ZN7S1387C33v14Ev");}
void  S1387C3 ::v15(){vfunc_called(this, "_ZN7S1387C33v15Ev");}
void  S1387C3 ::v16(){vfunc_called(this, "_ZN7S1387C33v16Ev");}
void  S1387C3 ::v17(){vfunc_called(this, "_ZN7S1387C33v17Ev");}
void  S1387C3 ::v18(){vfunc_called(this, "_ZN7S1387C33v18Ev");}
void  S1387C3 ::v19(){vfunc_called(this, "_ZN7S1387C33v19Ev");}
void  S1387C3 ::v20(){vfunc_called(this, "_ZN7S1387C33v20Ev");}
void  S1387C3 ::v21(){vfunc_called(this, "_ZN7S1387C33v21Ev");}
void  S1387C3 ::v22(){vfunc_called(this, "_ZN7S1387C33v22Ev");}
void  S1387C3 ::v23(){vfunc_called(this, "_ZN7S1387C33v23Ev");}
void  S1387C3 ::v24(){vfunc_called(this, "_ZN7S1387C33v24Ev");}
void  S1387C3 ::v25(){vfunc_called(this, "_ZN7S1387C33v25Ev");}
void  S1387C3 ::v26(){vfunc_called(this, "_ZN7S1387C33v26Ev");}
S1387C3 ::S1387C3(){ note_ctor("S1387C3", this);} // tgen

static void Test_S1387C3()
{
  extern Class_Descriptor cd_S1387C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1387C3, buf);
    S1387C3 *dp, &lv = *(dp=new (buf) S1387C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1387C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1387C3)");
    check_base_class_offset(lv, (S1387C4*), 0, "S1387C3");
    check_field_offset(lv, s1387c3f0, ABISELECT(56,32), "S1387C3.s1387c3f0");
    check_field_offset(lv, s1387c3f1, ABISELECT(72,44), "S1387C3.s1387c3f1");
    check_field_offset(lv, s1387c3f2, ABISELECT(96,60), "S1387C3.s1387c3f2");
    check_field_offset(lv, s1387c3f3, ABISELECT(112,76), "S1387C3.s1387c3f3");
    test_class_info(&lv, &cd_S1387C3);
    dp->~S1387C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1387C3(Test_S1387C3, "S1387C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1387C3C1Ev();
extern void _ZN7S1387C3D1Ev();
Name_Map name_map_S1387C3[] = {
  NSPAIR(_ZN7S1387C3C1Ev),
  NSPAIR(_ZN7S1387C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1387C4;
extern VTBL_ENTRY _ZTI7S1387C4[];
extern  VTBL_ENTRY _ZTV7S1387C4[];
static Base_Class bases_S1387C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1387C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1387C3[];
extern void _ZN7S1387C3D1Ev();
extern void _ZN7S1387C3D0Ev();
extern void _ZN7S1387C42v3Ev();
extern void _ZN7S1387C42v4Ev();
extern void _ZN7S1387C42v5Ev();
extern void _ZN7S1387C42v6Ev();
extern void _ZN7S1387C42v7Ev();
extern void _ZN7S1387C42v8Ev();
extern void _ZN7S1387C42v9Ev();
extern void _ZN7S1387C43v10Ev();
extern void _ZN7S1387C43v11Ev();
extern void _ZN7S1387C43v12Ev();
extern void _ZN7S1387C33v13Ev();
extern void _ZN7S1387C33v14Ev();
extern void _ZN7S1387C33v15Ev();
extern void _ZN7S1387C33v16Ev();
extern void _ZN7S1387C33v17Ev();
extern void _ZN7S1387C33v18Ev();
extern void _ZN7S1387C33v19Ev();
extern void _ZN7S1387C33v20Ev();
extern void _ZN7S1387C33v21Ev();
extern void _ZN7S1387C33v22Ev();
extern void _ZN7S1387C33v23Ev();
extern void _ZN7S1387C33v24Ev();
extern void _ZN7S1387C33v25Ev();
extern void _ZN7S1387C33v26Ev();
static  VTBL_ENTRY vtc_S1387C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1387C3[0]),
  (VTBL_ENTRY)&_ZN7S1387C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1387C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v26Ev,
};
extern VTBL_ENTRY _ZTI7S1387C3[];
extern  VTBL_ENTRY _ZTV7S1387C3[];
Class_Descriptor cd_S1387C3 = {  "S1387C3", // class name
  bases_S1387C3, 1,
  &(vtc_S1387C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1387C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1387C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1387C2  : S1387C3 {
  ::S10103C84 s1387c2f0;
  virtual  ~S1387C2(); // _ZN7S1387C2D1Ev
  virtual void  v27(); // _ZN7S1387C23v27Ev
  S1387C2(); // tgen
};
//SIG(-1 S1387C2) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 FC13{ BC14{ BC15{ vd v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 Fp[2] FC4 Fp} vd v40 v41 v42 v43 v44 v45 Fp Fi FC7 FC11 Fi} vd v26 v27 v28 v29 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}}


 S1387C2 ::~S1387C2(){ note_dtor("S1387C2", this);}
void  S1387C2 ::v27(){vfunc_called(this, "_ZN7S1387C23v27Ev");}
S1387C2 ::S1387C2(){ note_ctor("S1387C2", this);} // tgen

static void Test_S1387C2()
{
  extern Class_Descriptor cd_S1387C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(55,80)];
    init_test(&cd_S1387C2, buf);
    S1387C2 *dp, &lv = *(dp=new (buf) S1387C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(432,316), "sizeof(S1387C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1387C2)");
    check_base_class_offset(lv, (S1387C4*)(S1387C3*), 0, "S1387C2");
    check_base_class_offset(lv, (S1387C3*), 0, "S1387C2");
    check_field_offset(lv, s1387c2f0, ABISELECT(136,92), "S1387C2.s1387c2f0");
    test_class_info(&lv, &cd_S1387C2);
    dp->~S1387C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1387C2(Test_S1387C2, "S1387C2", ABISELECT(432,316));

#else // __cplusplus

extern void _ZN7S1387C2C1Ev();
extern void _ZN7S1387C2D1Ev();
Name_Map name_map_S1387C2[] = {
  NSPAIR(_ZN7S1387C2C1Ev),
  NSPAIR(_ZN7S1387C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1387C4;
extern VTBL_ENTRY _ZTI7S1387C4[];
extern  VTBL_ENTRY _ZTV7S1387C4[];
extern Class_Descriptor cd_S1387C3;
extern VTBL_ENTRY _ZTI7S1387C3[];
extern  VTBL_ENTRY _ZTV7S1387C3[];
static Base_Class bases_S1387C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1387C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1387C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1387C2[];
extern void _ZN7S1387C2D1Ev();
extern void _ZN7S1387C2D0Ev();
extern void _ZN7S1387C42v3Ev();
extern void _ZN7S1387C42v4Ev();
extern void _ZN7S1387C42v5Ev();
extern void _ZN7S1387C42v6Ev();
extern void _ZN7S1387C42v7Ev();
extern void _ZN7S1387C42v8Ev();
extern void _ZN7S1387C42v9Ev();
extern void _ZN7S1387C43v10Ev();
extern void _ZN7S1387C43v11Ev();
extern void _ZN7S1387C43v12Ev();
extern void _ZN7S1387C33v13Ev();
extern void _ZN7S1387C33v14Ev();
extern void _ZN7S1387C33v15Ev();
extern void _ZN7S1387C33v16Ev();
extern void _ZN7S1387C33v17Ev();
extern void _ZN7S1387C33v18Ev();
extern void _ZN7S1387C33v19Ev();
extern void _ZN7S1387C33v20Ev();
extern void _ZN7S1387C33v21Ev();
extern void _ZN7S1387C33v22Ev();
extern void _ZN7S1387C33v23Ev();
extern void _ZN7S1387C33v24Ev();
extern void _ZN7S1387C33v25Ev();
extern void _ZN7S1387C33v26Ev();
extern void _ZN7S1387C23v27Ev();
static  VTBL_ENTRY vtc_S1387C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1387C2[0]),
  (VTBL_ENTRY)&_ZN7S1387C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1387C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1387C23v27Ev,
};
extern VTBL_ENTRY _ZTI7S1387C2[];
extern  VTBL_ENTRY _ZTV7S1387C2[];
Class_Descriptor cd_S1387C2 = {  "S1387C2", // class name
  bases_S1387C2, 2,
  &(vtc_S1387C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(432,316), // object size
  NSPAIRA(_ZTI7S1387C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1387C2),29, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1387C1  : S1387C2 {
  ::S10103C84 s1387c1f0;
  ::S10103C84 s1387c1f1;
  virtual  ~S1387C1(); // _ZN7S1387C1D1Ev
  virtual void  v1(); // _ZN7S1387C12v1Ev
  virtual void  v2(); // _ZN7S1387C12v2Ev
  S1387C1(); // tgen
};
//SIG(1 S1387C1) C1{ BC2{ BC3{ BC4{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} vd v27 FC14{ BC15{ BC16{ vd v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 Fp[2] FC5 Fp} vd v42 v43 v44 v45 v46 v47 Fp Fi FC8 FC12 Fi} vd v28 v29 v30 v31 FC5[4] FC12 FC12 FC12 FC12 Fi[6]}} vd v1 v2 FC14 FC14}


 S1387C1 ::~S1387C1(){ note_dtor("S1387C1", this);}
void  S1387C1 ::v1(){vfunc_called(this, "_ZN7S1387C12v1Ev");}
void  S1387C1 ::v2(){vfunc_called(this, "_ZN7S1387C12v2Ev");}
S1387C1 ::S1387C1(){ note_ctor("S1387C1", this);} // tgen

static void Test_S1387C1()
{
  extern Class_Descriptor cd_S1387C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(129,192)];
    init_test(&cd_S1387C1, buf);
    S1387C1 *dp, &lv = *(dp=new (buf) S1387C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1024,764), "sizeof(S1387C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1387C1)");
    check_base_class_offset(lv, (S1387C4*)(S1387C3*)(S1387C2*), 0, "S1387C1");
    check_base_class_offset(lv, (S1387C3*)(S1387C2*), 0, "S1387C1");
    check_base_class_offset(lv, (S1387C2*), 0, "S1387C1");
    check_field_offset(lv, s1387c1f0, ABISELECT(432,316), "S1387C1.s1387c1f0");
    check_field_offset(lv, s1387c1f1, ABISELECT(728,540), "S1387C1.s1387c1f1");
    test_class_info(&lv, &cd_S1387C1);
    dp->~S1387C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1387C1(Test_S1387C1, "S1387C1", ABISELECT(1024,764));

#else // __cplusplus

extern void _ZN7S1387C1C1Ev();
extern void _ZN7S1387C1D1Ev();
Name_Map name_map_S1387C1[] = {
  NSPAIR(_ZN7S1387C1C1Ev),
  NSPAIR(_ZN7S1387C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1387C4;
extern VTBL_ENTRY _ZTI7S1387C4[];
extern  VTBL_ENTRY _ZTV7S1387C4[];
extern Class_Descriptor cd_S1387C3;
extern VTBL_ENTRY _ZTI7S1387C3[];
extern  VTBL_ENTRY _ZTV7S1387C3[];
extern Class_Descriptor cd_S1387C2;
extern VTBL_ENTRY _ZTI7S1387C2[];
extern  VTBL_ENTRY _ZTV7S1387C2[];
static Base_Class bases_S1387C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1387C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1387C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1387C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1387C1[];
extern void _ZN7S1387C1D1Ev();
extern void _ZN7S1387C1D0Ev();
extern void _ZN7S1387C42v3Ev();
extern void _ZN7S1387C42v4Ev();
extern void _ZN7S1387C42v5Ev();
extern void _ZN7S1387C42v6Ev();
extern void _ZN7S1387C42v7Ev();
extern void _ZN7S1387C42v8Ev();
extern void _ZN7S1387C42v9Ev();
extern void _ZN7S1387C43v10Ev();
extern void _ZN7S1387C43v11Ev();
extern void _ZN7S1387C43v12Ev();
extern void _ZN7S1387C33v13Ev();
extern void _ZN7S1387C33v14Ev();
extern void _ZN7S1387C33v15Ev();
extern void _ZN7S1387C33v16Ev();
extern void _ZN7S1387C33v17Ev();
extern void _ZN7S1387C33v18Ev();
extern void _ZN7S1387C33v19Ev();
extern void _ZN7S1387C33v20Ev();
extern void _ZN7S1387C33v21Ev();
extern void _ZN7S1387C33v22Ev();
extern void _ZN7S1387C33v23Ev();
extern void _ZN7S1387C33v24Ev();
extern void _ZN7S1387C33v25Ev();
extern void _ZN7S1387C33v26Ev();
extern void _ZN7S1387C23v27Ev();
extern void _ZN7S1387C12v1Ev();
extern void _ZN7S1387C12v2Ev();
static  VTBL_ENTRY vtc_S1387C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1387C1[0]),
  (VTBL_ENTRY)&_ZN7S1387C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1387C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1387C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1387C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1387C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1387C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1387C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1387C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S1387C1[];
extern  VTBL_ENTRY _ZTV7S1387C1[];
Class_Descriptor cd_S1387C1 = {  "S1387C1", // class name
  bases_S1387C1, 3,
  &(vtc_S1387C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1024,764), // object size
  NSPAIRA(_ZTI7S1387C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1387C1),31, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3327C3  {
  void *s3327c3f0[2];
  ::S10103C13_nt s3327c3f1;
  void *s3327c3f2;
  virtual  ~S3327C3(); // _ZN7S3327C3D1Ev
  virtual void  v5(); // _ZN7S3327C32v5Ev
  virtual void  v6(); // _ZN7S3327C32v6Ev
  virtual void  v7(); // _ZN7S3327C32v7Ev
  virtual void  v8(); // _ZN7S3327C32v8Ev
  virtual void  v9(); // _ZN7S3327C32v9Ev
  virtual void  v10(); // _ZN7S3327C33v10Ev
  virtual void  v11(); // _ZN7S3327C33v11Ev
  virtual void  v12(); // _ZN7S3327C33v12Ev
  virtual void  v13(); // _ZN7S3327C33v13Ev
  virtual void  v14(); // _ZN7S3327C33v14Ev
  S3327C3(); // tgen
};
//SIG(-1 S3327C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3327C3 ::~S3327C3(){ note_dtor("S3327C3", this);}
void  S3327C3 ::v5(){vfunc_called(this, "_ZN7S3327C32v5Ev");}
void  S3327C3 ::v6(){vfunc_called(this, "_ZN7S3327C32v6Ev");}
void  S3327C3 ::v7(){vfunc_called(this, "_ZN7S3327C32v7Ev");}
void  S3327C3 ::v8(){vfunc_called(this, "_ZN7S3327C32v8Ev");}
void  S3327C3 ::v9(){vfunc_called(this, "_ZN7S3327C32v9Ev");}
void  S3327C3 ::v10(){vfunc_called(this, "_ZN7S3327C33v10Ev");}
void  S3327C3 ::v11(){vfunc_called(this, "_ZN7S3327C33v11Ev");}
void  S3327C3 ::v12(){vfunc_called(this, "_ZN7S3327C33v12Ev");}
void  S3327C3 ::v13(){vfunc_called(this, "_ZN7S3327C33v13Ev");}
void  S3327C3 ::v14(){vfunc_called(this, "_ZN7S3327C33v14Ev");}
S3327C3 ::S3327C3(){ note_ctor("S3327C3", this);} // tgen

static void Test_S3327C3()
{
  extern Class_Descriptor cd_S3327C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3327C3, buf);
    S3327C3 *dp, &lv = *(dp=new (buf) S3327C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3327C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3327C3)");
    check_field_offset(lv, s3327c3f0, ABISELECT(8,4), "S3327C3.s3327c3f0");
    check_field_offset(lv, s3327c3f1, ABISELECT(24,12), "S3327C3.s3327c3f1");
    check_field_offset(lv, s3327c3f2, ABISELECT(48,28), "S3327C3.s3327c3f2");
    test_class_info(&lv, &cd_S3327C3);
    dp->~S3327C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3327C3(Test_S3327C3, "S3327C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3327C3C1Ev();
extern void _ZN7S3327C3D1Ev();
Name_Map name_map_S3327C3[] = {
  NSPAIR(_ZN7S3327C3C1Ev),
  NSPAIR(_ZN7S3327C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3327C3[];
extern void _ZN7S3327C3D1Ev();
extern void _ZN7S3327C3D0Ev();
extern void _ZN7S3327C32v5Ev();
extern void _ZN7S3327C32v6Ev();
extern void _ZN7S3327C32v7Ev();
extern void _ZN7S3327C32v8Ev();
extern void _ZN7S3327C32v9Ev();
extern void _ZN7S3327C33v10Ev();
extern void _ZN7S3327C33v11Ev();
extern void _ZN7S3327C33v12Ev();
extern void _ZN7S3327C33v13Ev();
extern void _ZN7S3327C33v14Ev();
static  VTBL_ENTRY vtc_S3327C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3327C3[0]),
  (VTBL_ENTRY)&_ZN7S3327C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3327C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3327C3[];
extern  VTBL_ENTRY _ZTV7S3327C3[];
Class_Descriptor cd_S3327C3 = {  "S3327C3", // class name
  0,0,//no base classes
  &(vtc_S3327C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3327C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3327C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3327C2  : S3327C3 {
  ::S10103C86 s3327c2f0;
  ::S10103C106 s3327c2f1;
  ::S10103C82_nt s3327c2f2;
  ::S10103C13_nt s3327c2f3;
  virtual  ~S3327C2(); // _ZN7S3327C2D1Ev
  virtual void  v15(); // _ZN7S3327C23v15Ev
  virtual void  v16(); // _ZN7S3327C23v16Ev
  virtual void  v17(); // _ZN7S3327C23v17Ev
  virtual void  v18(); // _ZN7S3327C23v18Ev
  virtual void  v19(); // _ZN7S3327C23v19Ev
  virtual void  v20(); // _ZN7S3327C23v20Ev
  virtual void  v21(); // _ZN7S3327C23v21Ev
  virtual void  v22(); // _ZN7S3327C23v22Ev
  virtual void  v23(); // _ZN7S3327C23v23Ev
  virtual void  v24(); // _ZN7S3327C23v24Ev
  virtual void  v25(); // _ZN7S3327C23v25Ev
  virtual void  v26(); // _ZN7S3327C23v26Ev
  virtual void  v27(); // _ZN7S3327C23v27Ev
  virtual void  v28(); // _ZN7S3327C23v28Ev
  S3327C2(); // tgen
};
//SIG(-1 S3327C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3327C2 ::~S3327C2(){ note_dtor("S3327C2", this);}
void  S3327C2 ::v15(){vfunc_called(this, "_ZN7S3327C23v15Ev");}
void  S3327C2 ::v16(){vfunc_called(this, "_ZN7S3327C23v16Ev");}
void  S3327C2 ::v17(){vfunc_called(this, "_ZN7S3327C23v17Ev");}
void  S3327C2 ::v18(){vfunc_called(this, "_ZN7S3327C23v18Ev");}
void  S3327C2 ::v19(){vfunc_called(this, "_ZN7S3327C23v19Ev");}
void  S3327C2 ::v20(){vfunc_called(this, "_ZN7S3327C23v20Ev");}
void  S3327C2 ::v21(){vfunc_called(this, "_ZN7S3327C23v21Ev");}
void  S3327C2 ::v22(){vfunc_called(this, "_ZN7S3327C23v22Ev");}
void  S3327C2 ::v23(){vfunc_called(this, "_ZN7S3327C23v23Ev");}
void  S3327C2 ::v24(){vfunc_called(this, "_ZN7S3327C23v24Ev");}
void  S3327C2 ::v25(){vfunc_called(this, "_ZN7S3327C23v25Ev");}
void  S3327C2 ::v26(){vfunc_called(this, "_ZN7S3327C23v26Ev");}
void  S3327C2 ::v27(){vfunc_called(this, "_ZN7S3327C23v27Ev");}
void  S3327C2 ::v28(){vfunc_called(this, "_ZN7S3327C23v28Ev");}
S3327C2 ::S3327C2(){ note_ctor("S3327C2", this);} // tgen

static void Test_S3327C2()
{
  extern Class_Descriptor cd_S3327C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3327C2, buf);
    S3327C2 *dp, &lv = *(dp=new (buf) S3327C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3327C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3327C2)");
    check_base_class_offset(lv, (S3327C3*), 0, "S3327C2");
    check_field_offset(lv, s3327c2f0, ABISELECT(56,32), "S3327C2.s3327c2f0");
    check_field_offset(lv, s3327c2f1, ABISELECT(72,44), "S3327C2.s3327c2f1");
    check_field_offset(lv, s3327c2f2, ABISELECT(96,60), "S3327C2.s3327c2f2");
    check_field_offset(lv, s3327c2f3, ABISELECT(112,76), "S3327C2.s3327c2f3");
    test_class_info(&lv, &cd_S3327C2);
    dp->~S3327C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3327C2(Test_S3327C2, "S3327C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3327C2C1Ev();
extern void _ZN7S3327C2D1Ev();
Name_Map name_map_S3327C2[] = {
  NSPAIR(_ZN7S3327C2C1Ev),
  NSPAIR(_ZN7S3327C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3327C3;
extern VTBL_ENTRY _ZTI7S3327C3[];
extern  VTBL_ENTRY _ZTV7S3327C3[];
static Base_Class bases_S3327C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3327C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3327C2[];
extern void _ZN7S3327C2D1Ev();
extern void _ZN7S3327C2D0Ev();
extern void _ZN7S3327C32v5Ev();
extern void _ZN7S3327C32v6Ev();
extern void _ZN7S3327C32v7Ev();
extern void _ZN7S3327C32v8Ev();
extern void _ZN7S3327C32v9Ev();
extern void _ZN7S3327C33v10Ev();
extern void _ZN7S3327C33v11Ev();
extern void _ZN7S3327C33v12Ev();
extern void _ZN7S3327C33v13Ev();
extern void _ZN7S3327C33v14Ev();
extern void _ZN7S3327C23v15Ev();
extern void _ZN7S3327C23v16Ev();
extern void _ZN7S3327C23v17Ev();
extern void _ZN7S3327C23v18Ev();
extern void _ZN7S3327C23v19Ev();
extern void _ZN7S3327C23v20Ev();
extern void _ZN7S3327C23v21Ev();
extern void _ZN7S3327C23v22Ev();
extern void _ZN7S3327C23v23Ev();
extern void _ZN7S3327C23v24Ev();
extern void _ZN7S3327C23v25Ev();
extern void _ZN7S3327C23v26Ev();
extern void _ZN7S3327C23v27Ev();
extern void _ZN7S3327C23v28Ev();
static  VTBL_ENTRY vtc_S3327C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3327C2[0]),
  (VTBL_ENTRY)&_ZN7S3327C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3327C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v28Ev,
};
extern VTBL_ENTRY _ZTI7S3327C2[];
extern  VTBL_ENTRY _ZTV7S3327C2[];
Class_Descriptor cd_S3327C2 = {  "S3327C2", // class name
  bases_S3327C2, 1,
  &(vtc_S3327C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3327C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3327C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3327C1  : S3327C2 {
  int s3327c1f0[2];
  ::S10103C84 s3327c1f1[4];
  virtual  ~S3327C1(); // _ZN7S3327C1D1Ev
  virtual void  v1(); // _ZN7S3327C12v1Ev
  virtual void  v2(); // _ZN7S3327C12v2Ev
  virtual void  v3(); // _ZN7S3327C12v3Ev
  virtual void  v4(); // _ZN7S3327C12v4Ev
  S3327C1(); // tgen
};
//SIG(1 S3327C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi[2] FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}[4]}


 S3327C1 ::~S3327C1(){ note_dtor("S3327C1", this);}
void  S3327C1 ::v1(){vfunc_called(this, "_ZN7S3327C12v1Ev");}
void  S3327C1 ::v2(){vfunc_called(this, "_ZN7S3327C12v2Ev");}
void  S3327C1 ::v3(){vfunc_called(this, "_ZN7S3327C12v3Ev");}
void  S3327C1 ::v4(){vfunc_called(this, "_ZN7S3327C12v4Ev");}
S3327C1 ::S3327C1(){ note_ctor("S3327C1", this);} // tgen

static void Test_S3327C1()
{
  extern Class_Descriptor cd_S3327C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(167,250)];
    init_test(&cd_S3327C1, buf);
    S3327C1 *dp, &lv = *(dp=new (buf) S3327C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(1328,996), "sizeof(S3327C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3327C1)");
    check_base_class_offset(lv, (S3327C3*)(S3327C2*), 0, "S3327C1");
    check_base_class_offset(lv, (S3327C2*), 0, "S3327C1");
    check_field_offset(lv, s3327c1f0, ABISELECT(136,92), "S3327C1.s3327c1f0");
    check_field_offset(lv, s3327c1f1, ABISELECT(144,100), "S3327C1.s3327c1f1");
    test_class_info(&lv, &cd_S3327C1);
    dp->~S3327C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3327C1(Test_S3327C1, "S3327C1", ABISELECT(1328,996));

#else // __cplusplus

extern void _ZN7S3327C1C1Ev();
extern void _ZN7S3327C1D1Ev();
Name_Map name_map_S3327C1[] = {
  NSPAIR(_ZN7S3327C1C1Ev),
  NSPAIR(_ZN7S3327C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3327C3;
extern VTBL_ENTRY _ZTI7S3327C3[];
extern  VTBL_ENTRY _ZTV7S3327C3[];
extern Class_Descriptor cd_S3327C2;
extern VTBL_ENTRY _ZTI7S3327C2[];
extern  VTBL_ENTRY _ZTV7S3327C2[];
static Base_Class bases_S3327C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3327C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3327C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3327C1[];
extern void _ZN7S3327C1D1Ev();
extern void _ZN7S3327C1D0Ev();
extern void _ZN7S3327C32v5Ev();
extern void _ZN7S3327C32v6Ev();
extern void _ZN7S3327C32v7Ev();
extern void _ZN7S3327C32v8Ev();
extern void _ZN7S3327C32v9Ev();
extern void _ZN7S3327C33v10Ev();
extern void _ZN7S3327C33v11Ev();
extern void _ZN7S3327C33v12Ev();
extern void _ZN7S3327C33v13Ev();
extern void _ZN7S3327C33v14Ev();
extern void _ZN7S3327C23v15Ev();
extern void _ZN7S3327C23v16Ev();
extern void _ZN7S3327C23v17Ev();
extern void _ZN7S3327C23v18Ev();
extern void _ZN7S3327C23v19Ev();
extern void _ZN7S3327C23v20Ev();
extern void _ZN7S3327C23v21Ev();
extern void _ZN7S3327C23v22Ev();
extern void _ZN7S3327C23v23Ev();
extern void _ZN7S3327C23v24Ev();
extern void _ZN7S3327C23v25Ev();
extern void _ZN7S3327C23v26Ev();
extern void _ZN7S3327C23v27Ev();
extern void _ZN7S3327C23v28Ev();
extern void _ZN7S3327C12v1Ev();
extern void _ZN7S3327C12v2Ev();
extern void _ZN7S3327C12v3Ev();
extern void _ZN7S3327C12v4Ev();
static  VTBL_ENTRY vtc_S3327C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3327C1[0]),
  (VTBL_ENTRY)&_ZN7S3327C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3327C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3327C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3327C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3327C23v28Ev,
  (VTBL_ENTRY)&_ZN7S3327C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3327C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3327C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3327C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3327C1[];
extern  VTBL_ENTRY _ZTV7S3327C1[];
Class_Descriptor cd_S3327C1 = {  "S3327C1", // class name
  bases_S3327C1, 2,
  &(vtc_S3327C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(1328,996), // object size
  NSPAIRA(_ZTI7S3327C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3327C1),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3326C3  {
  void *s3326c3f0[2];
  ::S10103C13_nt s3326c3f1;
  void *s3326c3f2;
  virtual  ~S3326C3(); // _ZN7S3326C3D1Ev
  virtual void  v5(); // _ZN7S3326C32v5Ev
  virtual void  v6(); // _ZN7S3326C32v6Ev
  virtual void  v7(); // _ZN7S3326C32v7Ev
  virtual void  v8(); // _ZN7S3326C32v8Ev
  virtual void  v9(); // _ZN7S3326C32v9Ev
  virtual void  v10(); // _ZN7S3326C33v10Ev
  virtual void  v11(); // _ZN7S3326C33v11Ev
  virtual void  v12(); // _ZN7S3326C33v12Ev
  virtual void  v13(); // _ZN7S3326C33v13Ev
  virtual void  v14(); // _ZN7S3326C33v14Ev
  S3326C3(); // tgen
};
//SIG(-1 S3326C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3326C3 ::~S3326C3(){ note_dtor("S3326C3", this);}
void  S3326C3 ::v5(){vfunc_called(this, "_ZN7S3326C32v5Ev");}
void  S3326C3 ::v6(){vfunc_called(this, "_ZN7S3326C32v6Ev");}
void  S3326C3 ::v7(){vfunc_called(this, "_ZN7S3326C32v7Ev");}
void  S3326C3 ::v8(){vfunc_called(this, "_ZN7S3326C32v8Ev");}
void  S3326C3 ::v9(){vfunc_called(this, "_ZN7S3326C32v9Ev");}
void  S3326C3 ::v10(){vfunc_called(this, "_ZN7S3326C33v10Ev");}
void  S3326C3 ::v11(){vfunc_called(this, "_ZN7S3326C33v11Ev");}
void  S3326C3 ::v12(){vfunc_called(this, "_ZN7S3326C33v12Ev");}
void  S3326C3 ::v13(){vfunc_called(this, "_ZN7S3326C33v13Ev");}
void  S3326C3 ::v14(){vfunc_called(this, "_ZN7S3326C33v14Ev");}
S3326C3 ::S3326C3(){ note_ctor("S3326C3", this);} // tgen

static void Test_S3326C3()
{
  extern Class_Descriptor cd_S3326C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3326C3, buf);
    S3326C3 *dp, &lv = *(dp=new (buf) S3326C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3326C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3326C3)");
    check_field_offset(lv, s3326c3f0, ABISELECT(8,4), "S3326C3.s3326c3f0");
    check_field_offset(lv, s3326c3f1, ABISELECT(24,12), "S3326C3.s3326c3f1");
    check_field_offset(lv, s3326c3f2, ABISELECT(48,28), "S3326C3.s3326c3f2");
    test_class_info(&lv, &cd_S3326C3);
    dp->~S3326C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3326C3(Test_S3326C3, "S3326C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3326C3C1Ev();
extern void _ZN7S3326C3D1Ev();
Name_Map name_map_S3326C3[] = {
  NSPAIR(_ZN7S3326C3C1Ev),
  NSPAIR(_ZN7S3326C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3326C3[];
extern void _ZN7S3326C3D1Ev();
extern void _ZN7S3326C3D0Ev();
extern void _ZN7S3326C32v5Ev();
extern void _ZN7S3326C32v6Ev();
extern void _ZN7S3326C32v7Ev();
extern void _ZN7S3326C32v8Ev();
extern void _ZN7S3326C32v9Ev();
extern void _ZN7S3326C33v10Ev();
extern void _ZN7S3326C33v11Ev();
extern void _ZN7S3326C33v12Ev();
extern void _ZN7S3326C33v13Ev();
extern void _ZN7S3326C33v14Ev();
static  VTBL_ENTRY vtc_S3326C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3326C3[0]),
  (VTBL_ENTRY)&_ZN7S3326C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3326C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3326C3[];
extern  VTBL_ENTRY _ZTV7S3326C3[];
Class_Descriptor cd_S3326C3 = {  "S3326C3", // class name
  0,0,//no base classes
  &(vtc_S3326C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3326C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3326C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3326C2  : S3326C3 {
  ::S10103C86 s3326c2f0;
  ::S10103C106 s3326c2f1;
  ::S10103C82_nt s3326c2f2;
  ::S10103C13_nt s3326c2f3;
  virtual  ~S3326C2(); // _ZN7S3326C2D1Ev
  virtual void  v15(); // _ZN7S3326C23v15Ev
  virtual void  v16(); // _ZN7S3326C23v16Ev
  virtual void  v17(); // _ZN7S3326C23v17Ev
  virtual void  v18(); // _ZN7S3326C23v18Ev
  virtual void  v19(); // _ZN7S3326C23v19Ev
  virtual void  v20(); // _ZN7S3326C23v20Ev
  virtual void  v21(); // _ZN7S3326C23v21Ev
  virtual void  v22(); // _ZN7S3326C23v22Ev
  virtual void  v23(); // _ZN7S3326C23v23Ev
  virtual void  v24(); // _ZN7S3326C23v24Ev
  virtual void  v25(); // _ZN7S3326C23v25Ev
  virtual void  v26(); // _ZN7S3326C23v26Ev
  virtual void  v27(); // _ZN7S3326C23v27Ev
  virtual void  v28(); // _ZN7S3326C23v28Ev
  S3326C2(); // tgen
};
//SIG(-1 S3326C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3326C2 ::~S3326C2(){ note_dtor("S3326C2", this);}
void  S3326C2 ::v15(){vfunc_called(this, "_ZN7S3326C23v15Ev");}
void  S3326C2 ::v16(){vfunc_called(this, "_ZN7S3326C23v16Ev");}
void  S3326C2 ::v17(){vfunc_called(this, "_ZN7S3326C23v17Ev");}
void  S3326C2 ::v18(){vfunc_called(this, "_ZN7S3326C23v18Ev");}
void  S3326C2 ::v19(){vfunc_called(this, "_ZN7S3326C23v19Ev");}
void  S3326C2 ::v20(){vfunc_called(this, "_ZN7S3326C23v20Ev");}
void  S3326C2 ::v21(){vfunc_called(this, "_ZN7S3326C23v21Ev");}
void  S3326C2 ::v22(){vfunc_called(this, "_ZN7S3326C23v22Ev");}
void  S3326C2 ::v23(){vfunc_called(this, "_ZN7S3326C23v23Ev");}
void  S3326C2 ::v24(){vfunc_called(this, "_ZN7S3326C23v24Ev");}
void  S3326C2 ::v25(){vfunc_called(this, "_ZN7S3326C23v25Ev");}
void  S3326C2 ::v26(){vfunc_called(this, "_ZN7S3326C23v26Ev");}
void  S3326C2 ::v27(){vfunc_called(this, "_ZN7S3326C23v27Ev");}
void  S3326C2 ::v28(){vfunc_called(this, "_ZN7S3326C23v28Ev");}
S3326C2 ::S3326C2(){ note_ctor("S3326C2", this);} // tgen

static void Test_S3326C2()
{
  extern Class_Descriptor cd_S3326C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3326C2, buf);
    S3326C2 *dp, &lv = *(dp=new (buf) S3326C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3326C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3326C2)");
    check_base_class_offset(lv, (S3326C3*), 0, "S3326C2");
    check_field_offset(lv, s3326c2f0, ABISELECT(56,32), "S3326C2.s3326c2f0");
    check_field_offset(lv, s3326c2f1, ABISELECT(72,44), "S3326C2.s3326c2f1");
    check_field_offset(lv, s3326c2f2, ABISELECT(96,60), "S3326C2.s3326c2f2");
    check_field_offset(lv, s3326c2f3, ABISELECT(112,76), "S3326C2.s3326c2f3");
    test_class_info(&lv, &cd_S3326C2);
    dp->~S3326C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3326C2(Test_S3326C2, "S3326C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3326C2C1Ev();
extern void _ZN7S3326C2D1Ev();
Name_Map name_map_S3326C2[] = {
  NSPAIR(_ZN7S3326C2C1Ev),
  NSPAIR(_ZN7S3326C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3326C3;
extern VTBL_ENTRY _ZTI7S3326C3[];
extern  VTBL_ENTRY _ZTV7S3326C3[];
static Base_Class bases_S3326C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3326C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3326C2[];
extern void _ZN7S3326C2D1Ev();
extern void _ZN7S3326C2D0Ev();
extern void _ZN7S3326C32v5Ev();
extern void _ZN7S3326C32v6Ev();
extern void _ZN7S3326C32v7Ev();
extern void _ZN7S3326C32v8Ev();
extern void _ZN7S3326C32v9Ev();
extern void _ZN7S3326C33v10Ev();
extern void _ZN7S3326C33v11Ev();
extern void _ZN7S3326C33v12Ev();
extern void _ZN7S3326C33v13Ev();
extern void _ZN7S3326C33v14Ev();
extern void _ZN7S3326C23v15Ev();
extern void _ZN7S3326C23v16Ev();
extern void _ZN7S3326C23v17Ev();
extern void _ZN7S3326C23v18Ev();
extern void _ZN7S3326C23v19Ev();
extern void _ZN7S3326C23v20Ev();
extern void _ZN7S3326C23v21Ev();
extern void _ZN7S3326C23v22Ev();
extern void _ZN7S3326C23v23Ev();
extern void _ZN7S3326C23v24Ev();
extern void _ZN7S3326C23v25Ev();
extern void _ZN7S3326C23v26Ev();
extern void _ZN7S3326C23v27Ev();
extern void _ZN7S3326C23v28Ev();
static  VTBL_ENTRY vtc_S3326C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3326C2[0]),
  (VTBL_ENTRY)&_ZN7S3326C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3326C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v28Ev,
};
extern VTBL_ENTRY _ZTI7S3326C2[];
extern  VTBL_ENTRY _ZTV7S3326C2[];
Class_Descriptor cd_S3326C2 = {  "S3326C2", // class name
  bases_S3326C2, 1,
  &(vtc_S3326C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3326C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3326C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3326C1  : S3326C2 {
  int s3326c1f0[2];
  ::S10103C84 s3326c1f1[2];
  virtual  ~S3326C1(); // _ZN7S3326C1D1Ev
  virtual void  v1(); // _ZN7S3326C12v1Ev
  virtual void  v2(); // _ZN7S3326C12v2Ev
  virtual void  v3(); // _ZN7S3326C12v3Ev
  virtual void  v4(); // _ZN7S3326C12v4Ev
  S3326C1(); // tgen
};
//SIG(1 S3326C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi[2] FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}[2]}


 S3326C1 ::~S3326C1(){ note_dtor("S3326C1", this);}
void  S3326C1 ::v1(){vfunc_called(this, "_ZN7S3326C12v1Ev");}
void  S3326C1 ::v2(){vfunc_called(this, "_ZN7S3326C12v2Ev");}
void  S3326C1 ::v3(){vfunc_called(this, "_ZN7S3326C12v3Ev");}
void  S3326C1 ::v4(){vfunc_called(this, "_ZN7S3326C12v4Ev");}
S3326C1 ::S3326C1(){ note_ctor("S3326C1", this);} // tgen

static void Test_S3326C1()
{
  extern Class_Descriptor cd_S3326C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(93,138)];
    init_test(&cd_S3326C1, buf);
    S3326C1 *dp, &lv = *(dp=new (buf) S3326C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(736,548), "sizeof(S3326C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3326C1)");
    check_base_class_offset(lv, (S3326C3*)(S3326C2*), 0, "S3326C1");
    check_base_class_offset(lv, (S3326C2*), 0, "S3326C1");
    check_field_offset(lv, s3326c1f0, ABISELECT(136,92), "S3326C1.s3326c1f0");
    check_field_offset(lv, s3326c1f1, ABISELECT(144,100), "S3326C1.s3326c1f1");
    test_class_info(&lv, &cd_S3326C1);
    dp->~S3326C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3326C1(Test_S3326C1, "S3326C1", ABISELECT(736,548));

#else // __cplusplus

extern void _ZN7S3326C1C1Ev();
extern void _ZN7S3326C1D1Ev();
Name_Map name_map_S3326C1[] = {
  NSPAIR(_ZN7S3326C1C1Ev),
  NSPAIR(_ZN7S3326C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3326C3;
extern VTBL_ENTRY _ZTI7S3326C3[];
extern  VTBL_ENTRY _ZTV7S3326C3[];
extern Class_Descriptor cd_S3326C2;
extern VTBL_ENTRY _ZTI7S3326C2[];
extern  VTBL_ENTRY _ZTV7S3326C2[];
static Base_Class bases_S3326C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3326C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3326C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3326C1[];
extern void _ZN7S3326C1D1Ev();
extern void _ZN7S3326C1D0Ev();
extern void _ZN7S3326C32v5Ev();
extern void _ZN7S3326C32v6Ev();
extern void _ZN7S3326C32v7Ev();
extern void _ZN7S3326C32v8Ev();
extern void _ZN7S3326C32v9Ev();
extern void _ZN7S3326C33v10Ev();
extern void _ZN7S3326C33v11Ev();
extern void _ZN7S3326C33v12Ev();
extern void _ZN7S3326C33v13Ev();
extern void _ZN7S3326C33v14Ev();
extern void _ZN7S3326C23v15Ev();
extern void _ZN7S3326C23v16Ev();
extern void _ZN7S3326C23v17Ev();
extern void _ZN7S3326C23v18Ev();
extern void _ZN7S3326C23v19Ev();
extern void _ZN7S3326C23v20Ev();
extern void _ZN7S3326C23v21Ev();
extern void _ZN7S3326C23v22Ev();
extern void _ZN7S3326C23v23Ev();
extern void _ZN7S3326C23v24Ev();
extern void _ZN7S3326C23v25Ev();
extern void _ZN7S3326C23v26Ev();
extern void _ZN7S3326C23v27Ev();
extern void _ZN7S3326C23v28Ev();
extern void _ZN7S3326C12v1Ev();
extern void _ZN7S3326C12v2Ev();
extern void _ZN7S3326C12v3Ev();
extern void _ZN7S3326C12v4Ev();
static  VTBL_ENTRY vtc_S3326C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3326C1[0]),
  (VTBL_ENTRY)&_ZN7S3326C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3326C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3326C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3326C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3326C23v28Ev,
  (VTBL_ENTRY)&_ZN7S3326C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3326C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3326C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3326C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3326C1[];
extern  VTBL_ENTRY _ZTV7S3326C1[];
Class_Descriptor cd_S3326C1 = {  "S3326C1", // class name
  bases_S3326C1, 2,
  &(vtc_S3326C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(736,548), // object size
  NSPAIRA(_ZTI7S3326C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3326C1),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3330C3  {
  void *s3330c3f0[2];
  ::S10103C13_nt s3330c3f1;
  void *s3330c3f2;
  virtual  ~S3330C3(); // _ZN7S3330C3D1Ev
  virtual void  v5(); // _ZN7S3330C32v5Ev
  virtual void  v6(); // _ZN7S3330C32v6Ev
  virtual void  v7(); // _ZN7S3330C32v7Ev
  virtual void  v8(); // _ZN7S3330C32v8Ev
  virtual void  v9(); // _ZN7S3330C32v9Ev
  virtual void  v10(); // _ZN7S3330C33v10Ev
  virtual void  v11(); // _ZN7S3330C33v11Ev
  virtual void  v12(); // _ZN7S3330C33v12Ev
  virtual void  v13(); // _ZN7S3330C33v13Ev
  virtual void  v14(); // _ZN7S3330C33v14Ev
  S3330C3(); // tgen
};
//SIG(-1 S3330C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3330C3 ::~S3330C3(){ note_dtor("S3330C3", this);}
void  S3330C3 ::v5(){vfunc_called(this, "_ZN7S3330C32v5Ev");}
void  S3330C3 ::v6(){vfunc_called(this, "_ZN7S3330C32v6Ev");}
void  S3330C3 ::v7(){vfunc_called(this, "_ZN7S3330C32v7Ev");}
void  S3330C3 ::v8(){vfunc_called(this, "_ZN7S3330C32v8Ev");}
void  S3330C3 ::v9(){vfunc_called(this, "_ZN7S3330C32v9Ev");}
void  S3330C3 ::v10(){vfunc_called(this, "_ZN7S3330C33v10Ev");}
void  S3330C3 ::v11(){vfunc_called(this, "_ZN7S3330C33v11Ev");}
void  S3330C3 ::v12(){vfunc_called(this, "_ZN7S3330C33v12Ev");}
void  S3330C3 ::v13(){vfunc_called(this, "_ZN7S3330C33v13Ev");}
void  S3330C3 ::v14(){vfunc_called(this, "_ZN7S3330C33v14Ev");}
S3330C3 ::S3330C3(){ note_ctor("S3330C3", this);} // tgen

static void Test_S3330C3()
{
  extern Class_Descriptor cd_S3330C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3330C3, buf);
    S3330C3 *dp, &lv = *(dp=new (buf) S3330C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3330C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3330C3)");
    check_field_offset(lv, s3330c3f0, ABISELECT(8,4), "S3330C3.s3330c3f0");
    check_field_offset(lv, s3330c3f1, ABISELECT(24,12), "S3330C3.s3330c3f1");
    check_field_offset(lv, s3330c3f2, ABISELECT(48,28), "S3330C3.s3330c3f2");
    test_class_info(&lv, &cd_S3330C3);
    dp->~S3330C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3330C3(Test_S3330C3, "S3330C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3330C3C1Ev();
extern void _ZN7S3330C3D1Ev();
Name_Map name_map_S3330C3[] = {
  NSPAIR(_ZN7S3330C3C1Ev),
  NSPAIR(_ZN7S3330C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3330C3[];
extern void _ZN7S3330C3D1Ev();
extern void _ZN7S3330C3D0Ev();
extern void _ZN7S3330C32v5Ev();
extern void _ZN7S3330C32v6Ev();
extern void _ZN7S3330C32v7Ev();
extern void _ZN7S3330C32v8Ev();
extern void _ZN7S3330C32v9Ev();
extern void _ZN7S3330C33v10Ev();
extern void _ZN7S3330C33v11Ev();
extern void _ZN7S3330C33v12Ev();
extern void _ZN7S3330C33v13Ev();
extern void _ZN7S3330C33v14Ev();
static  VTBL_ENTRY vtc_S3330C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3330C3[0]),
  (VTBL_ENTRY)&_ZN7S3330C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3330C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3330C3[];
extern  VTBL_ENTRY _ZTV7S3330C3[];
Class_Descriptor cd_S3330C3 = {  "S3330C3", // class name
  0,0,//no base classes
  &(vtc_S3330C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3330C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3330C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3330C2  : S3330C3 {
  ::S10103C86 s3330c2f0;
  ::S10103C106 s3330c2f1;
  ::S10103C82_nt s3330c2f2;
  ::S10103C13_nt s3330c2f3;
  virtual  ~S3330C2(); // _ZN7S3330C2D1Ev
  virtual void  v15(); // _ZN7S3330C23v15Ev
  virtual void  v16(); // _ZN7S3330C23v16Ev
  virtual void  v17(); // _ZN7S3330C23v17Ev
  virtual void  v18(); // _ZN7S3330C23v18Ev
  virtual void  v19(); // _ZN7S3330C23v19Ev
  virtual void  v20(); // _ZN7S3330C23v20Ev
  virtual void  v21(); // _ZN7S3330C23v21Ev
  virtual void  v22(); // _ZN7S3330C23v22Ev
  virtual void  v23(); // _ZN7S3330C23v23Ev
  virtual void  v24(); // _ZN7S3330C23v24Ev
  virtual void  v25(); // _ZN7S3330C23v25Ev
  virtual void  v26(); // _ZN7S3330C23v26Ev
  virtual void  v27(); // _ZN7S3330C23v27Ev
  virtual void  v28(); // _ZN7S3330C23v28Ev
  S3330C2(); // tgen
};
//SIG(-1 S3330C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3330C2 ::~S3330C2(){ note_dtor("S3330C2", this);}
void  S3330C2 ::v15(){vfunc_called(this, "_ZN7S3330C23v15Ev");}
void  S3330C2 ::v16(){vfunc_called(this, "_ZN7S3330C23v16Ev");}
void  S3330C2 ::v17(){vfunc_called(this, "_ZN7S3330C23v17Ev");}
void  S3330C2 ::v18(){vfunc_called(this, "_ZN7S3330C23v18Ev");}
void  S3330C2 ::v19(){vfunc_called(this, "_ZN7S3330C23v19Ev");}
void  S3330C2 ::v20(){vfunc_called(this, "_ZN7S3330C23v20Ev");}
void  S3330C2 ::v21(){vfunc_called(this, "_ZN7S3330C23v21Ev");}
void  S3330C2 ::v22(){vfunc_called(this, "_ZN7S3330C23v22Ev");}
void  S3330C2 ::v23(){vfunc_called(this, "_ZN7S3330C23v23Ev");}
void  S3330C2 ::v24(){vfunc_called(this, "_ZN7S3330C23v24Ev");}
void  S3330C2 ::v25(){vfunc_called(this, "_ZN7S3330C23v25Ev");}
void  S3330C2 ::v26(){vfunc_called(this, "_ZN7S3330C23v26Ev");}
void  S3330C2 ::v27(){vfunc_called(this, "_ZN7S3330C23v27Ev");}
void  S3330C2 ::v28(){vfunc_called(this, "_ZN7S3330C23v28Ev");}
S3330C2 ::S3330C2(){ note_ctor("S3330C2", this);} // tgen

static void Test_S3330C2()
{
  extern Class_Descriptor cd_S3330C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3330C2, buf);
    S3330C2 *dp, &lv = *(dp=new (buf) S3330C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3330C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3330C2)");
    check_base_class_offset(lv, (S3330C3*), 0, "S3330C2");
    check_field_offset(lv, s3330c2f0, ABISELECT(56,32), "S3330C2.s3330c2f0");
    check_field_offset(lv, s3330c2f1, ABISELECT(72,44), "S3330C2.s3330c2f1");
    check_field_offset(lv, s3330c2f2, ABISELECT(96,60), "S3330C2.s3330c2f2");
    check_field_offset(lv, s3330c2f3, ABISELECT(112,76), "S3330C2.s3330c2f3");
    test_class_info(&lv, &cd_S3330C2);
    dp->~S3330C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3330C2(Test_S3330C2, "S3330C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3330C2C1Ev();
extern void _ZN7S3330C2D1Ev();
Name_Map name_map_S3330C2[] = {
  NSPAIR(_ZN7S3330C2C1Ev),
  NSPAIR(_ZN7S3330C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3330C3;
extern VTBL_ENTRY _ZTI7S3330C3[];
extern  VTBL_ENTRY _ZTV7S3330C3[];
static Base_Class bases_S3330C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3330C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3330C2[];
extern void _ZN7S3330C2D1Ev();
extern void _ZN7S3330C2D0Ev();
extern void _ZN7S3330C32v5Ev();
extern void _ZN7S3330C32v6Ev();
extern void _ZN7S3330C32v7Ev();
extern void _ZN7S3330C32v8Ev();
extern void _ZN7S3330C32v9Ev();
extern void _ZN7S3330C33v10Ev();
extern void _ZN7S3330C33v11Ev();
extern void _ZN7S3330C33v12Ev();
extern void _ZN7S3330C33v13Ev();
extern void _ZN7S3330C33v14Ev();
extern void _ZN7S3330C23v15Ev();
extern void _ZN7S3330C23v16Ev();
extern void _ZN7S3330C23v17Ev();
extern void _ZN7S3330C23v18Ev();
extern void _ZN7S3330C23v19Ev();
extern void _ZN7S3330C23v20Ev();
extern void _ZN7S3330C23v21Ev();
extern void _ZN7S3330C23v22Ev();
extern void _ZN7S3330C23v23Ev();
extern void _ZN7S3330C23v24Ev();
extern void _ZN7S3330C23v25Ev();
extern void _ZN7S3330C23v26Ev();
extern void _ZN7S3330C23v27Ev();
extern void _ZN7S3330C23v28Ev();
static  VTBL_ENTRY vtc_S3330C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3330C2[0]),
  (VTBL_ENTRY)&_ZN7S3330C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3330C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v28Ev,
};
extern VTBL_ENTRY _ZTI7S3330C2[];
extern  VTBL_ENTRY _ZTV7S3330C2[];
Class_Descriptor cd_S3330C2 = {  "S3330C2", // class name
  bases_S3330C2, 1,
  &(vtc_S3330C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3330C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3330C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3330C1  : S3330C2 {
  int s3330c1f0[6];
  ::S10103C84 s3330c1f1[2];
  virtual  ~S3330C1(); // _ZN7S3330C1D1Ev
  virtual void  v1(); // _ZN7S3330C12v1Ev
  virtual void  v2(); // _ZN7S3330C12v2Ev
  virtual void  v3(); // _ZN7S3330C12v3Ev
  virtual void  v4(); // _ZN7S3330C12v4Ev
  S3330C1(); // tgen
};
//SIG(1 S3330C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi[6] FC13{ BC14{ BC15{ vd v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 Fp[2] FC4 Fp} vd v43 v44 v45 v46 v47 v48 Fp Fi FC7 FC11 Fi} vd v29 v30 v31 v32 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}[2]}


 S3330C1 ::~S3330C1(){ note_dtor("S3330C1", this);}
void  S3330C1 ::v1(){vfunc_called(this, "_ZN7S3330C12v1Ev");}
void  S3330C1 ::v2(){vfunc_called(this, "_ZN7S3330C12v2Ev");}
void  S3330C1 ::v3(){vfunc_called(this, "_ZN7S3330C12v3Ev");}
void  S3330C1 ::v4(){vfunc_called(this, "_ZN7S3330C12v4Ev");}
S3330C1 ::S3330C1(){ note_ctor("S3330C1", this);} // tgen

static void Test_S3330C1()
{
  extern Class_Descriptor cd_S3330C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(95,142)];
    init_test(&cd_S3330C1, buf);
    S3330C1 *dp, &lv = *(dp=new (buf) S3330C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(752,564), "sizeof(S3330C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3330C1)");
    check_base_class_offset(lv, (S3330C3*)(S3330C2*), 0, "S3330C1");
    check_base_class_offset(lv, (S3330C2*), 0, "S3330C1");
    check_field_offset(lv, s3330c1f0, ABISELECT(136,92), "S3330C1.s3330c1f0");
    check_field_offset(lv, s3330c1f1, ABISELECT(160,116), "S3330C1.s3330c1f1");
    test_class_info(&lv, &cd_S3330C1);
    dp->~S3330C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3330C1(Test_S3330C1, "S3330C1", ABISELECT(752,564));

#else // __cplusplus

extern void _ZN7S3330C1C1Ev();
extern void _ZN7S3330C1D1Ev();
Name_Map name_map_S3330C1[] = {
  NSPAIR(_ZN7S3330C1C1Ev),
  NSPAIR(_ZN7S3330C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3330C3;
extern VTBL_ENTRY _ZTI7S3330C3[];
extern  VTBL_ENTRY _ZTV7S3330C3[];
extern Class_Descriptor cd_S3330C2;
extern VTBL_ENTRY _ZTI7S3330C2[];
extern  VTBL_ENTRY _ZTV7S3330C2[];
static Base_Class bases_S3330C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3330C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3330C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3330C1[];
extern void _ZN7S3330C1D1Ev();
extern void _ZN7S3330C1D0Ev();
extern void _ZN7S3330C32v5Ev();
extern void _ZN7S3330C32v6Ev();
extern void _ZN7S3330C32v7Ev();
extern void _ZN7S3330C32v8Ev();
extern void _ZN7S3330C32v9Ev();
extern void _ZN7S3330C33v10Ev();
extern void _ZN7S3330C33v11Ev();
extern void _ZN7S3330C33v12Ev();
extern void _ZN7S3330C33v13Ev();
extern void _ZN7S3330C33v14Ev();
extern void _ZN7S3330C23v15Ev();
extern void _ZN7S3330C23v16Ev();
extern void _ZN7S3330C23v17Ev();
extern void _ZN7S3330C23v18Ev();
extern void _ZN7S3330C23v19Ev();
extern void _ZN7S3330C23v20Ev();
extern void _ZN7S3330C23v21Ev();
extern void _ZN7S3330C23v22Ev();
extern void _ZN7S3330C23v23Ev();
extern void _ZN7S3330C23v24Ev();
extern void _ZN7S3330C23v25Ev();
extern void _ZN7S3330C23v26Ev();
extern void _ZN7S3330C23v27Ev();
extern void _ZN7S3330C23v28Ev();
extern void _ZN7S3330C12v1Ev();
extern void _ZN7S3330C12v2Ev();
extern void _ZN7S3330C12v3Ev();
extern void _ZN7S3330C12v4Ev();
static  VTBL_ENTRY vtc_S3330C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3330C1[0]),
  (VTBL_ENTRY)&_ZN7S3330C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3330C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3330C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3330C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3330C23v28Ev,
  (VTBL_ENTRY)&_ZN7S3330C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3330C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3330C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3330C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3330C1[];
extern  VTBL_ENTRY _ZTV7S3330C1[];
Class_Descriptor cd_S3330C1 = {  "S3330C1", // class name
  bases_S3330C1, 2,
  &(vtc_S3330C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(752,564), // object size
  NSPAIRA(_ZTI7S3330C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3330C1),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1386C4  {
  void *s1386c4f0[2];
  ::S10103C13_nt s1386c4f1;
  void *s1386c4f2;
  virtual  ~S1386C4(); // _ZN7S1386C4D1Ev
  virtual void  v3(); // _ZN7S1386C42v3Ev
  virtual void  v4(); // _ZN7S1386C42v4Ev
  virtual void  v5(); // _ZN7S1386C42v5Ev
  virtual void  v6(); // _ZN7S1386C42v6Ev
  virtual void  v7(); // _ZN7S1386C42v7Ev
  virtual void  v8(); // _ZN7S1386C42v8Ev
  virtual void  v9(); // _ZN7S1386C42v9Ev
  virtual void  v10(); // _ZN7S1386C43v10Ev
  virtual void  v11(); // _ZN7S1386C43v11Ev
  virtual void  v12(); // _ZN7S1386C43v12Ev
  S1386C4(); // tgen
};
//SIG(-1 S1386C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1386C4 ::~S1386C4(){ note_dtor("S1386C4", this);}
void  S1386C4 ::v3(){vfunc_called(this, "_ZN7S1386C42v3Ev");}
void  S1386C4 ::v4(){vfunc_called(this, "_ZN7S1386C42v4Ev");}
void  S1386C4 ::v5(){vfunc_called(this, "_ZN7S1386C42v5Ev");}
void  S1386C4 ::v6(){vfunc_called(this, "_ZN7S1386C42v6Ev");}
void  S1386C4 ::v7(){vfunc_called(this, "_ZN7S1386C42v7Ev");}
void  S1386C4 ::v8(){vfunc_called(this, "_ZN7S1386C42v8Ev");}
void  S1386C4 ::v9(){vfunc_called(this, "_ZN7S1386C42v9Ev");}
void  S1386C4 ::v10(){vfunc_called(this, "_ZN7S1386C43v10Ev");}
void  S1386C4 ::v11(){vfunc_called(this, "_ZN7S1386C43v11Ev");}
void  S1386C4 ::v12(){vfunc_called(this, "_ZN7S1386C43v12Ev");}
S1386C4 ::S1386C4(){ note_ctor("S1386C4", this);} // tgen

static void Test_S1386C4()
{
  extern Class_Descriptor cd_S1386C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1386C4, buf);
    S1386C4 *dp, &lv = *(dp=new (buf) S1386C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1386C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1386C4)");
    check_field_offset(lv, s1386c4f0, ABISELECT(8,4), "S1386C4.s1386c4f0");
    check_field_offset(lv, s1386c4f1, ABISELECT(24,12), "S1386C4.s1386c4f1");
    check_field_offset(lv, s1386c4f2, ABISELECT(48,28), "S1386C4.s1386c4f2");
    test_class_info(&lv, &cd_S1386C4);
    dp->~S1386C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1386C4(Test_S1386C4, "S1386C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1386C4C1Ev();
extern void _ZN7S1386C4D1Ev();
Name_Map name_map_S1386C4[] = {
  NSPAIR(_ZN7S1386C4C1Ev),
  NSPAIR(_ZN7S1386C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1386C4[];
extern void _ZN7S1386C4D1Ev();
extern void _ZN7S1386C4D0Ev();
extern void _ZN7S1386C42v3Ev();
extern void _ZN7S1386C42v4Ev();
extern void _ZN7S1386C42v5Ev();
extern void _ZN7S1386C42v6Ev();
extern void _ZN7S1386C42v7Ev();
extern void _ZN7S1386C42v8Ev();
extern void _ZN7S1386C42v9Ev();
extern void _ZN7S1386C43v10Ev();
extern void _ZN7S1386C43v11Ev();
extern void _ZN7S1386C43v12Ev();
static  VTBL_ENTRY vtc_S1386C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1386C4[0]),
  (VTBL_ENTRY)&_ZN7S1386C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1386C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v12Ev,
};
extern VTBL_ENTRY _ZTI7S1386C4[];
extern  VTBL_ENTRY _ZTV7S1386C4[];
Class_Descriptor cd_S1386C4 = {  "S1386C4", // class name
  0,0,//no base classes
  &(vtc_S1386C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1386C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1386C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1386C3  : S1386C4 {
  ::S10103C86 s1386c3f0;
  ::S10103C106 s1386c3f1;
  ::S10103C82_nt s1386c3f2;
  ::S10103C13_nt s1386c3f3;
  virtual  ~S1386C3(); // _ZN7S1386C3D1Ev
  virtual void  v13(); // _ZN7S1386C33v13Ev
  virtual void  v14(); // _ZN7S1386C33v14Ev
  virtual void  v15(); // _ZN7S1386C33v15Ev
  virtual void  v16(); // _ZN7S1386C33v16Ev
  virtual void  v17(); // _ZN7S1386C33v17Ev
  virtual void  v18(); // _ZN7S1386C33v18Ev
  virtual void  v19(); // _ZN7S1386C33v19Ev
  virtual void  v20(); // _ZN7S1386C33v20Ev
  virtual void  v21(); // _ZN7S1386C33v21Ev
  virtual void  v22(); // _ZN7S1386C33v22Ev
  virtual void  v23(); // _ZN7S1386C33v23Ev
  virtual void  v24(); // _ZN7S1386C33v24Ev
  virtual void  v25(); // _ZN7S1386C33v25Ev
  virtual void  v26(); // _ZN7S1386C33v26Ev
  S1386C3(); // tgen
};
//SIG(-1 S1386C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1386C3 ::~S1386C3(){ note_dtor("S1386C3", this);}
void  S1386C3 ::v13(){vfunc_called(this, "_ZN7S1386C33v13Ev");}
void  S1386C3 ::v14(){vfunc_called(this, "_ZN7S1386C33v14Ev");}
void  S1386C3 ::v15(){vfunc_called(this, "_ZN7S1386C33v15Ev");}
void  S1386C3 ::v16(){vfunc_called(this, "_ZN7S1386C33v16Ev");}
void  S1386C3 ::v17(){vfunc_called(this, "_ZN7S1386C33v17Ev");}
void  S1386C3 ::v18(){vfunc_called(this, "_ZN7S1386C33v18Ev");}
void  S1386C3 ::v19(){vfunc_called(this, "_ZN7S1386C33v19Ev");}
void  S1386C3 ::v20(){vfunc_called(this, "_ZN7S1386C33v20Ev");}
void  S1386C3 ::v21(){vfunc_called(this, "_ZN7S1386C33v21Ev");}
void  S1386C3 ::v22(){vfunc_called(this, "_ZN7S1386C33v22Ev");}
void  S1386C3 ::v23(){vfunc_called(this, "_ZN7S1386C33v23Ev");}
void  S1386C3 ::v24(){vfunc_called(this, "_ZN7S1386C33v24Ev");}
void  S1386C3 ::v25(){vfunc_called(this, "_ZN7S1386C33v25Ev");}
void  S1386C3 ::v26(){vfunc_called(this, "_ZN7S1386C33v26Ev");}
S1386C3 ::S1386C3(){ note_ctor("S1386C3", this);} // tgen

static void Test_S1386C3()
{
  extern Class_Descriptor cd_S1386C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1386C3, buf);
    S1386C3 *dp, &lv = *(dp=new (buf) S1386C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1386C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1386C3)");
    check_base_class_offset(lv, (S1386C4*), 0, "S1386C3");
    check_field_offset(lv, s1386c3f0, ABISELECT(56,32), "S1386C3.s1386c3f0");
    check_field_offset(lv, s1386c3f1, ABISELECT(72,44), "S1386C3.s1386c3f1");
    check_field_offset(lv, s1386c3f2, ABISELECT(96,60), "S1386C3.s1386c3f2");
    check_field_offset(lv, s1386c3f3, ABISELECT(112,76), "S1386C3.s1386c3f3");
    test_class_info(&lv, &cd_S1386C3);
    dp->~S1386C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1386C3(Test_S1386C3, "S1386C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1386C3C1Ev();
extern void _ZN7S1386C3D1Ev();
Name_Map name_map_S1386C3[] = {
  NSPAIR(_ZN7S1386C3C1Ev),
  NSPAIR(_ZN7S1386C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1386C4;
extern VTBL_ENTRY _ZTI7S1386C4[];
extern  VTBL_ENTRY _ZTV7S1386C4[];
static Base_Class bases_S1386C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1386C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1386C3[];
extern void _ZN7S1386C3D1Ev();
extern void _ZN7S1386C3D0Ev();
extern void _ZN7S1386C42v3Ev();
extern void _ZN7S1386C42v4Ev();
extern void _ZN7S1386C42v5Ev();
extern void _ZN7S1386C42v6Ev();
extern void _ZN7S1386C42v7Ev();
extern void _ZN7S1386C42v8Ev();
extern void _ZN7S1386C42v9Ev();
extern void _ZN7S1386C43v10Ev();
extern void _ZN7S1386C43v11Ev();
extern void _ZN7S1386C43v12Ev();
extern void _ZN7S1386C33v13Ev();
extern void _ZN7S1386C33v14Ev();
extern void _ZN7S1386C33v15Ev();
extern void _ZN7S1386C33v16Ev();
extern void _ZN7S1386C33v17Ev();
extern void _ZN7S1386C33v18Ev();
extern void _ZN7S1386C33v19Ev();
extern void _ZN7S1386C33v20Ev();
extern void _ZN7S1386C33v21Ev();
extern void _ZN7S1386C33v22Ev();
extern void _ZN7S1386C33v23Ev();
extern void _ZN7S1386C33v24Ev();
extern void _ZN7S1386C33v25Ev();
extern void _ZN7S1386C33v26Ev();
static  VTBL_ENTRY vtc_S1386C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1386C3[0]),
  (VTBL_ENTRY)&_ZN7S1386C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1386C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v26Ev,
};
extern VTBL_ENTRY _ZTI7S1386C3[];
extern  VTBL_ENTRY _ZTV7S1386C3[];
Class_Descriptor cd_S1386C3 = {  "S1386C3", // class name
  bases_S1386C3, 1,
  &(vtc_S1386C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1386C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1386C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1386C2  : S1386C3 {
  ::S10103C84 s1386c2f0;
  virtual  ~S1386C2(); // _ZN7S1386C2D1Ev
  virtual void  v27(); // _ZN7S1386C23v27Ev
  S1386C2(); // tgen
};
//SIG(-1 S1386C2) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 FC13{ BC14{ BC15{ vd v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 Fp[2] FC4 Fp} vd v40 v41 v42 v43 v44 v45 Fp Fi FC7 FC11 Fi} vd v26 v27 v28 v29 FC4[4] FC11 FC11 FC11 FC11 Fi[6]}}


 S1386C2 ::~S1386C2(){ note_dtor("S1386C2", this);}
void  S1386C2 ::v27(){vfunc_called(this, "_ZN7S1386C23v27Ev");}
S1386C2 ::S1386C2(){ note_ctor("S1386C2", this);} // tgen

static void Test_S1386C2()
{
  extern Class_Descriptor cd_S1386C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(55,80)];
    init_test(&cd_S1386C2, buf);
    S1386C2 *dp, &lv = *(dp=new (buf) S1386C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(432,316), "sizeof(S1386C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1386C2)");
    check_base_class_offset(lv, (S1386C4*)(S1386C3*), 0, "S1386C2");
    check_base_class_offset(lv, (S1386C3*), 0, "S1386C2");
    check_field_offset(lv, s1386c2f0, ABISELECT(136,92), "S1386C2.s1386c2f0");
    test_class_info(&lv, &cd_S1386C2);
    dp->~S1386C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1386C2(Test_S1386C2, "S1386C2", ABISELECT(432,316));

#else // __cplusplus

extern void _ZN7S1386C2C1Ev();
extern void _ZN7S1386C2D1Ev();
Name_Map name_map_S1386C2[] = {
  NSPAIR(_ZN7S1386C2C1Ev),
  NSPAIR(_ZN7S1386C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1386C4;
extern VTBL_ENTRY _ZTI7S1386C4[];
extern  VTBL_ENTRY _ZTV7S1386C4[];
extern Class_Descriptor cd_S1386C3;
extern VTBL_ENTRY _ZTI7S1386C3[];
extern  VTBL_ENTRY _ZTV7S1386C3[];
static Base_Class bases_S1386C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1386C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1386C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1386C2[];
extern void _ZN7S1386C2D1Ev();
extern void _ZN7S1386C2D0Ev();
extern void _ZN7S1386C42v3Ev();
extern void _ZN7S1386C42v4Ev();
extern void _ZN7S1386C42v5Ev();
extern void _ZN7S1386C42v6Ev();
extern void _ZN7S1386C42v7Ev();
extern void _ZN7S1386C42v8Ev();
extern void _ZN7S1386C42v9Ev();
extern void _ZN7S1386C43v10Ev();
extern void _ZN7S1386C43v11Ev();
extern void _ZN7S1386C43v12Ev();
extern void _ZN7S1386C33v13Ev();
extern void _ZN7S1386C33v14Ev();
extern void _ZN7S1386C33v15Ev();
extern void _ZN7S1386C33v16Ev();
extern void _ZN7S1386C33v17Ev();
extern void _ZN7S1386C33v18Ev();
extern void _ZN7S1386C33v19Ev();
extern void _ZN7S1386C33v20Ev();
extern void _ZN7S1386C33v21Ev();
extern void _ZN7S1386C33v22Ev();
extern void _ZN7S1386C33v23Ev();
extern void _ZN7S1386C33v24Ev();
extern void _ZN7S1386C33v25Ev();
extern void _ZN7S1386C33v26Ev();
extern void _ZN7S1386C23v27Ev();
static  VTBL_ENTRY vtc_S1386C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1386C2[0]),
  (VTBL_ENTRY)&_ZN7S1386C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1386C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1386C23v27Ev,
};
extern VTBL_ENTRY _ZTI7S1386C2[];
extern  VTBL_ENTRY _ZTV7S1386C2[];
Class_Descriptor cd_S1386C2 = {  "S1386C2", // class name
  bases_S1386C2, 2,
  &(vtc_S1386C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(432,316), // object size
  NSPAIRA(_ZTI7S1386C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1386C2),29, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1386C1  : S1386C2 {
  ::S10103C84 s1386c1f0;
  virtual void  v1(); // _ZN7S1386C12v1Ev
  virtual void  v2(); // _ZN7S1386C12v2Ev
  ~S1386C1(); // tgen
  S1386C1(); // tgen
};
//SIG(1 S1386C1) C1{ BC2{ BC3{ BC4{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} vd v27 FC14{ BC15{ BC16{ vd v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 Fp[2] FC5 Fp} vd v42 v43 v44 v45 v46 v47 Fp Fi FC8 FC12 Fi} vd v28 v29 v30 v31 FC5[4] FC12 FC12 FC12 FC12 Fi[6]}} v1 v2 FC14}


void  S1386C1 ::v1(){vfunc_called(this, "_ZN7S1386C12v1Ev");}
void  S1386C1 ::v2(){vfunc_called(this, "_ZN7S1386C12v2Ev");}
S1386C1 ::~S1386C1(){ note_dtor("S1386C1", this);} // tgen
S1386C1 ::S1386C1(){ note_ctor("S1386C1", this);} // tgen

static void Test_S1386C1()
{
  extern Class_Descriptor cd_S1386C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(92,136)];
    init_test(&cd_S1386C1, buf);
    S1386C1 *dp, &lv = *(dp=new (buf) S1386C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(728,540), "sizeof(S1386C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1386C1)");
    check_base_class_offset(lv, (S1386C4*)(S1386C3*)(S1386C2*), 0, "S1386C1");
    check_base_class_offset(lv, (S1386C3*)(S1386C2*), 0, "S1386C1");
    check_base_class_offset(lv, (S1386C2*), 0, "S1386C1");
    check_field_offset(lv, s1386c1f0, ABISELECT(432,316), "S1386C1.s1386c1f0");
    test_class_info(&lv, &cd_S1386C1);
    dp->~S1386C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1386C1(Test_S1386C1, "S1386C1", ABISELECT(728,540));

#else // __cplusplus

extern void _ZN7S1386C1C1Ev();
extern void _ZN7S1386C1D1Ev();
Name_Map name_map_S1386C1[] = {
  NSPAIR(_ZN7S1386C1C1Ev),
  NSPAIR(_ZN7S1386C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1386C4;
extern VTBL_ENTRY _ZTI7S1386C4[];
extern  VTBL_ENTRY _ZTV7S1386C4[];
extern Class_Descriptor cd_S1386C3;
extern VTBL_ENTRY _ZTI7S1386C3[];
extern  VTBL_ENTRY _ZTV7S1386C3[];
extern Class_Descriptor cd_S1386C2;
extern VTBL_ENTRY _ZTI7S1386C2[];
extern  VTBL_ENTRY _ZTV7S1386C2[];
static Base_Class bases_S1386C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1386C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1386C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1386C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1386C1[];
extern void _ZN7S1386C1D1Ev();
extern void _ZN7S1386C1D0Ev();
extern void _ZN7S1386C42v3Ev();
extern void _ZN7S1386C42v4Ev();
extern void _ZN7S1386C42v5Ev();
extern void _ZN7S1386C42v6Ev();
extern void _ZN7S1386C42v7Ev();
extern void _ZN7S1386C42v8Ev();
extern void _ZN7S1386C42v9Ev();
extern void _ZN7S1386C43v10Ev();
extern void _ZN7S1386C43v11Ev();
extern void _ZN7S1386C43v12Ev();
extern void _ZN7S1386C33v13Ev();
extern void _ZN7S1386C33v14Ev();
extern void _ZN7S1386C33v15Ev();
extern void _ZN7S1386C33v16Ev();
extern void _ZN7S1386C33v17Ev();
extern void _ZN7S1386C33v18Ev();
extern void _ZN7S1386C33v19Ev();
extern void _ZN7S1386C33v20Ev();
extern void _ZN7S1386C33v21Ev();
extern void _ZN7S1386C33v22Ev();
extern void _ZN7S1386C33v23Ev();
extern void _ZN7S1386C33v24Ev();
extern void _ZN7S1386C33v25Ev();
extern void _ZN7S1386C33v26Ev();
extern void _ZN7S1386C23v27Ev();
extern void _ZN7S1386C12v1Ev();
extern void _ZN7S1386C12v2Ev();
static  VTBL_ENTRY vtc_S1386C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1386C1[0]),
  (VTBL_ENTRY)&_ZN7S1386C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1386C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1386C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1386C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1386C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1386C23v27Ev,
  (VTBL_ENTRY)&_ZN7S1386C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1386C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S1386C1[];
extern  VTBL_ENTRY _ZTV7S1386C1[];
Class_Descriptor cd_S1386C1 = {  "S1386C1", // class name
  bases_S1386C1, 3,
  &(vtc_S1386C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(728,540), // object size
  NSPAIRA(_ZTI7S1386C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1386C1),31, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3610C10  {
  void *s3610c10f0;
  ::S10103C13_nt s3610c10f1;
  ::S10103C16_nt s3610c10f2;
  ::S10103C17 s3610c10f3;
  virtual  ~S3610C10(); // _ZN8S3610C10D1Ev
  virtual void  v6(); // _ZN8S3610C102v6Ev
  virtual void  v7(); // _ZN8S3610C102v7Ev
  virtual void  v8(); // _ZN8S3610C102v8Ev
  virtual void  v9(); // _ZN8S3610C102v9Ev
  virtual void  v10(); // _ZN8S3610C103v10Ev
  virtual void  v11(); // _ZN8S3610C103v11Ev
  virtual void  v12(); // _ZN8S3610C103v12Ev
  virtual void  v13(); // _ZN8S3610C103v13Ev
  virtual void  v14(); // _ZN8S3610C103v14Ev
  virtual void  v15(); // _ZN8S3610C103v15Ev
  virtual void  v16(); // _ZN8S3610C103v16Ev
  virtual void  v17(); // _ZN8S3610C103v17Ev
  virtual void  v18(); // _ZN8S3610C103v18Ev
  virtual void  v19(); // _ZN8S3610C103v19Ev
  virtual void  v20(); // _ZN8S3610C103v20Ev
  virtual void  v21(); // _ZN8S3610C103v21Ev
  virtual void  v22(); // _ZN8S3610C103v22Ev
  virtual void  v23(); // _ZN8S3610C103v23Ev
  virtual void  v24(); // _ZN8S3610C103v24Ev
  virtual void  v25(); // _ZN8S3610C103v25Ev
  virtual void  v26(); // _ZN8S3610C103v26Ev
  virtual void  v27(); // _ZN8S3610C103v27Ev
  virtual void  v28(); // _ZN8S3610C103v28Ev
  virtual void  v29(); // _ZN8S3610C103v29Ev
  S3610C10(); // tgen
};
//SIG(-1 S3610C10) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S3610C10 ::~S3610C10(){ note_dtor("S3610C10", this);}
void  S3610C10 ::v6(){vfunc_called(this, "_ZN8S3610C102v6Ev");}
void  S3610C10 ::v7(){vfunc_called(this, "_ZN8S3610C102v7Ev");}
void  S3610C10 ::v8(){vfunc_called(this, "_ZN8S3610C102v8Ev");}
void  S3610C10 ::v9(){vfunc_called(this, "_ZN8S3610C102v9Ev");}
void  S3610C10 ::v10(){vfunc_called(this, "_ZN8S3610C103v10Ev");}
void  S3610C10 ::v11(){vfunc_called(this, "_ZN8S3610C103v11Ev");}
void  S3610C10 ::v12(){vfunc_called(this, "_ZN8S3610C103v12Ev");}
void  S3610C10 ::v13(){vfunc_called(this, "_ZN8S3610C103v13Ev");}
void  S3610C10 ::v14(){vfunc_called(this, "_ZN8S3610C103v14Ev");}
void  S3610C10 ::v15(){vfunc_called(this, "_ZN8S3610C103v15Ev");}
void  S3610C10 ::v16(){vfunc_called(this, "_ZN8S3610C103v16Ev");}
void  S3610C10 ::v17(){vfunc_called(this, "_ZN8S3610C103v17Ev");}
void  S3610C10 ::v18(){vfunc_called(this, "_ZN8S3610C103v18Ev");}
void  S3610C10 ::v19(){vfunc_called(this, "_ZN8S3610C103v19Ev");}
void  S3610C10 ::v20(){vfunc_called(this, "_ZN8S3610C103v20Ev");}
void  S3610C10 ::v21(){vfunc_called(this, "_ZN8S3610C103v21Ev");}
void  S3610C10 ::v22(){vfunc_called(this, "_ZN8S3610C103v22Ev");}
void  S3610C10 ::v23(){vfunc_called(this, "_ZN8S3610C103v23Ev");}
void  S3610C10 ::v24(){vfunc_called(this, "_ZN8S3610C103v24Ev");}
void  S3610C10 ::v25(){vfunc_called(this, "_ZN8S3610C103v25Ev");}
void  S3610C10 ::v26(){vfunc_called(this, "_ZN8S3610C103v26Ev");}
void  S3610C10 ::v27(){vfunc_called(this, "_ZN8S3610C103v27Ev");}
void  S3610C10 ::v28(){vfunc_called(this, "_ZN8S3610C103v28Ev");}
void  S3610C10 ::v29(){vfunc_called(this, "_ZN8S3610C103v29Ev");}
S3610C10 ::S3610C10(){ note_ctor("S3610C10", this);} // tgen

static void Test_S3610C10()
{
  extern Class_Descriptor cd_S3610C10;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S3610C10, buf);
    S3610C10 *dp, &lv = *(dp=new (buf) S3610C10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S3610C10)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3610C10)");
    check_field_offset(lv, s3610c10f0, ABISELECT(8,4), "S3610C10.s3610c10f0");
    check_field_offset(lv, s3610c10f1, ABISELECT(16,8), "S3610C10.s3610c10f1");
    check_field_offset(lv, s3610c10f2, ABISELECT(40,24), "S3610C10.s3610c10f2");
    check_field_offset(lv, s3610c10f3, ABISELECT(96,64), "S3610C10.s3610c10f3");
    test_class_info(&lv, &cd_S3610C10);
    dp->~S3610C10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3610C10(Test_S3610C10, "S3610C10", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN8S3610C10C1Ev();
extern void _ZN8S3610C10D1Ev();
Name_Map name_map_S3610C10[] = {
  NSPAIR(_ZN8S3610C10C1Ev),
  NSPAIR(_ZN8S3610C10D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S3610C10[];
extern void _ZN8S3610C10D1Ev();
extern void _ZN8S3610C10D0Ev();
extern void _ZN8S3610C102v6Ev();
extern void _ZN8S3610C102v7Ev();
extern void _ZN8S3610C102v8Ev();
extern void _ZN8S3610C102v9Ev();
extern void _ZN8S3610C103v10Ev();
extern void _ZN8S3610C103v11Ev();
extern void _ZN8S3610C103v12Ev();
extern void _ZN8S3610C103v13Ev();
extern void _ZN8S3610C103v14Ev();
extern void _ZN8S3610C103v15Ev();
extern void _ZN8S3610C103v16Ev();
extern void _ZN8S3610C103v17Ev();
extern void _ZN8S3610C103v18Ev();
extern void _ZN8S3610C103v19Ev();
extern void _ZN8S3610C103v20Ev();
extern void _ZN8S3610C103v21Ev();
extern void _ZN8S3610C103v22Ev();
extern void _ZN8S3610C103v23Ev();
extern void _ZN8S3610C103v24Ev();
extern void _ZN8S3610C103v25Ev();
extern void _ZN8S3610C103v26Ev();
extern void _ZN8S3610C103v27Ev();
extern void _ZN8S3610C103v28Ev();
extern void _ZN8S3610C103v29Ev();
static  VTBL_ENTRY vtc_S3610C10[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S3610C10[0]),
  (VTBL_ENTRY)&_ZN8S3610C10D1Ev,
  (VTBL_ENTRY)&_ZN8S3610C10D0Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v6Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v7Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v8Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v9Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v10Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v11Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v12Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v13Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v14Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v15Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v16Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v17Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v18Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v19Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v20Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v21Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v22Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v23Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v24Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v25Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v26Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v27Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v28Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v29Ev,
};
extern VTBL_ENTRY _ZTI8S3610C10[];
extern  VTBL_ENTRY _ZTV8S3610C10[];
Class_Descriptor cd_S3610C10 = {  "S3610C10", // class name
  0,0,//no base classes
  &(vtc_S3610C10[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI8S3610C10),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S3610C10),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3610C2  : S10103C5_nt , S3610C10 {
  int s3610c2f0;
  ::S10103C13_nt s3610c2f1;
  int s3610c2f2;
  ::S10103C105 s3610c2f3;
  ::S10103C105 s3610c2f4;
  ::S10103C25_nt s3610c2f5[2];
  ::S10103C25_nt s3610c2f6[2];
  ::S10103C14_nt s3610c2f7;
  virtual  ~S3610C2(); // _ZN7S3610C2D1Ev
  virtual void  v30(); // _ZN7S3610C23v30Ev
  S3610C2(); // tgen
};
//SIG(-1 S3610C2) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 Fi FC6 Fi FC11{ m Fp} FC11 FC12{ Fi[4]}[2] FC12[2] FC7}


 S3610C2 ::~S3610C2(){ note_dtor("S3610C2", this);}
void  S3610C2 ::v30(){vfunc_called(this, "_ZN7S3610C23v30Ev");}
S3610C2 ::S3610C2(){ note_ctor("S3610C2", this);} // tgen

static void Test_S3610C2()
{
  extern Class_Descriptor cd_S3610C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(39,56)];
    init_test(&cd_S3610C2, buf);
    S3610C2 *dp, &lv = *(dp=new (buf) S3610C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(304,220), "sizeof(S3610C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3610C2)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S3610C2");
    check_base_class_offset(lv, (S3610C10*), ABISELECT(48,32), "S3610C2");
    check_field_offset(lv, s3610c2f0, ABISELECT(168,112), "S3610C2.s3610c2f0");
    check_field_offset(lv, s3610c2f1, ABISELECT(176,116), "S3610C2.s3610c2f1");
    check_field_offset(lv, s3610c2f2, ABISELECT(200,132), "S3610C2.s3610c2f2");
    check_field_offset(lv, s3610c2f3, ABISELECT(208,136), "S3610C2.s3610c2f3");
    check_field_offset(lv, s3610c2f4, ABISELECT(216,140), "S3610C2.s3610c2f4");
    check_field_offset(lv, s3610c2f5, ABISELECT(224,144), "S3610C2.s3610c2f5");
    check_field_offset(lv, s3610c2f6, ABISELECT(256,176), "S3610C2.s3610c2f6");
    check_field_offset(lv, s3610c2f7, ABISELECT(288,208), "S3610C2.s3610c2f7");
    test_class_info(&lv, &cd_S3610C2);
    dp->~S3610C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3610C2(Test_S3610C2, "S3610C2", ABISELECT(304,220));

#else // __cplusplus

extern void _ZN7S3610C2C1Ev();
extern void _ZN7S3610C2D1Ev();
Name_Map name_map_S3610C2[] = {
  NSPAIR(_ZN7S3610C2C1Ev),
  NSPAIR(_ZN7S3610C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S3610C10;
extern VTBL_ENTRY _ZTI8S3610C10[];
extern  VTBL_ENTRY _ZTV8S3610C10[];
static Base_Class bases_S3610C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S3610C10,    ABISELECT(48,32), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3610C2[];
extern void _ZN7S3610C2D1Ev();
extern void _ZN7S3610C2D0Ev();
extern void _ZN7S3610C23v30Ev();
extern void ABISELECT(_ZThn48_N7S3610C2D1Ev,_ZThn32_N7S3610C2D1Ev)();
extern void ABISELECT(_ZThn48_N7S3610C2D0Ev,_ZThn32_N7S3610C2D0Ev)();
extern void _ZN8S3610C102v6Ev();
extern void _ZN8S3610C102v7Ev();
extern void _ZN8S3610C102v8Ev();
extern void _ZN8S3610C102v9Ev();
extern void _ZN8S3610C103v10Ev();
extern void _ZN8S3610C103v11Ev();
extern void _ZN8S3610C103v12Ev();
extern void _ZN8S3610C103v13Ev();
extern void _ZN8S3610C103v14Ev();
extern void _ZN8S3610C103v15Ev();
extern void _ZN8S3610C103v16Ev();
extern void _ZN8S3610C103v17Ev();
extern void _ZN8S3610C103v18Ev();
extern void _ZN8S3610C103v19Ev();
extern void _ZN8S3610C103v20Ev();
extern void _ZN8S3610C103v21Ev();
extern void _ZN8S3610C103v22Ev();
extern void _ZN8S3610C103v23Ev();
extern void _ZN8S3610C103v24Ev();
extern void _ZN8S3610C103v25Ev();
extern void _ZN8S3610C103v26Ev();
extern void _ZN8S3610C103v27Ev();
extern void _ZN8S3610C103v28Ev();
extern void _ZN8S3610C103v29Ev();
static  VTBL_ENTRY vtc_S3610C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3610C2[0]),
  (VTBL_ENTRY)&_ZN7S3610C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3610C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3610C23v30Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7S3610C2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3610C2D1Ev,_ZThn32_N7S3610C2D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3610C2D0Ev,_ZThn32_N7S3610C2D0Ev),
  (VTBL_ENTRY)&_ZN8S3610C102v6Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v7Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v8Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v9Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v10Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v11Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v12Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v13Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v14Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v15Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v16Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v17Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v18Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v19Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v20Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v21Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v22Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v23Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v24Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v25Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v26Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v27Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v28Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v29Ev,
};
extern VTBL_ENTRY _ZTI7S3610C2[];
extern  VTBL_ENTRY _ZTV7S3610C2[];
Class_Descriptor cd_S3610C2 = {  "S3610C2", // class name
  bases_S3610C2, 2,
  &(vtc_S3610C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(304,220), // object size
  NSPAIRA(_ZTI7S3610C2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7S3610C2),33, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3610C1  : S3610C2 {
  void *s3610c1f0[2];
  ::S10103C13_nt s3610c1f1;
  ::S10103C13_nt s3610c1f2;
  int s3610c1f3[2];
  virtual  ~S3610C1(); // _ZN7S3610C1D1Ev
  virtual void  v1(); // _ZN7S3610C12v1Ev
  virtual void  v2(); // _ZN7S3610C12v2Ev
  virtual void  v3(); // _ZN7S3610C12v3Ev
  virtual void  v4(); // _ZN7S3610C12v4Ev
  virtual void  v5(); // _ZN7S3610C12v5Ev
  S3610C1(); // tgen
};
//SIG(1 S3610C1) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v30 Fi FC7 Fi FC12{ m Fp} FC12 FC13{ Fi[4]}[2] FC13[2] FC8} vd v1 v2 v3 v4 v5 Fp[2] FC7 FC7 Fi[2]}


 S3610C1 ::~S3610C1(){ note_dtor("S3610C1", this);}
void  S3610C1 ::v1(){vfunc_called(this, "_ZN7S3610C12v1Ev");}
void  S3610C1 ::v2(){vfunc_called(this, "_ZN7S3610C12v2Ev");}
void  S3610C1 ::v3(){vfunc_called(this, "_ZN7S3610C12v3Ev");}
void  S3610C1 ::v4(){vfunc_called(this, "_ZN7S3610C12v4Ev");}
void  S3610C1 ::v5(){vfunc_called(this, "_ZN7S3610C12v5Ev");}
S3610C1 ::S3610C1(){ note_ctor("S3610C1", this);} // tgen

static void Test_S3610C1()
{
  extern Class_Descriptor cd_S3610C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(48,68)];
    init_test(&cd_S3610C1, buf);
    S3610C1 *dp, &lv = *(dp=new (buf) S3610C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(376,268), "sizeof(S3610C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3610C1)");
    check_base_class_offset(lv, (S10103C5_nt*)(S3610C2*), 0, "S3610C1");
    check_base_class_offset(lv, (S3610C10*)(S3610C2*), ABISELECT(48,32), "S3610C1");
    check_base_class_offset(lv, (S3610C2*), 0, "S3610C1");
    check_field_offset(lv, s3610c1f0, ABISELECT(304,220), "S3610C1.s3610c1f0");
    check_field_offset(lv, s3610c1f1, ABISELECT(320,228), "S3610C1.s3610c1f1");
    check_field_offset(lv, s3610c1f2, ABISELECT(344,244), "S3610C1.s3610c1f2");
    check_field_offset(lv, s3610c1f3, ABISELECT(368,260), "S3610C1.s3610c1f3");
    test_class_info(&lv, &cd_S3610C1);
    dp->~S3610C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3610C1(Test_S3610C1, "S3610C1", ABISELECT(376,268));

#else // __cplusplus

extern void _ZN7S3610C1C1Ev();
extern void _ZN7S3610C1D1Ev();
Name_Map name_map_S3610C1[] = {
  NSPAIR(_ZN7S3610C1C1Ev),
  NSPAIR(_ZN7S3610C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S3610C10;
extern VTBL_ENTRY _ZTI8S3610C10[];
extern  VTBL_ENTRY _ZTV8S3610C10[];
extern Class_Descriptor cd_S3610C2;
extern VTBL_ENTRY _ZTI7S3610C2[];
extern  VTBL_ENTRY _ZTV7S3610C2[];
static Base_Class bases_S3610C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S3610C10,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S3610C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3610C1[];
extern void _ZN7S3610C1D1Ev();
extern void _ZN7S3610C1D0Ev();
extern void _ZN7S3610C23v30Ev();
extern void _ZN7S3610C12v1Ev();
extern void _ZN7S3610C12v2Ev();
extern void _ZN7S3610C12v3Ev();
extern void _ZN7S3610C12v4Ev();
extern void _ZN7S3610C12v5Ev();
extern void ABISELECT(_ZThn48_N7S3610C1D1Ev,_ZThn32_N7S3610C1D1Ev)();
extern void ABISELECT(_ZThn48_N7S3610C1D0Ev,_ZThn32_N7S3610C1D0Ev)();
extern void _ZN8S3610C102v6Ev();
extern void _ZN8S3610C102v7Ev();
extern void _ZN8S3610C102v8Ev();
extern void _ZN8S3610C102v9Ev();
extern void _ZN8S3610C103v10Ev();
extern void _ZN8S3610C103v11Ev();
extern void _ZN8S3610C103v12Ev();
extern void _ZN8S3610C103v13Ev();
extern void _ZN8S3610C103v14Ev();
extern void _ZN8S3610C103v15Ev();
extern void _ZN8S3610C103v16Ev();
extern void _ZN8S3610C103v17Ev();
extern void _ZN8S3610C103v18Ev();
extern void _ZN8S3610C103v19Ev();
extern void _ZN8S3610C103v20Ev();
extern void _ZN8S3610C103v21Ev();
extern void _ZN8S3610C103v22Ev();
extern void _ZN8S3610C103v23Ev();
extern void _ZN8S3610C103v24Ev();
extern void _ZN8S3610C103v25Ev();
extern void _ZN8S3610C103v26Ev();
extern void _ZN8S3610C103v27Ev();
extern void _ZN8S3610C103v28Ev();
extern void _ZN8S3610C103v29Ev();
static  VTBL_ENTRY vtc_S3610C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3610C1[0]),
  (VTBL_ENTRY)&_ZN7S3610C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3610C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3610C23v30Ev,
  (VTBL_ENTRY)&_ZN7S3610C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3610C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3610C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3610C12v4Ev,
  (VTBL_ENTRY)&_ZN7S3610C12v5Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7S3610C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3610C1D1Ev,_ZThn32_N7S3610C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3610C1D0Ev,_ZThn32_N7S3610C1D0Ev),
  (VTBL_ENTRY)&_ZN8S3610C102v6Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v7Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v8Ev,
  (VTBL_ENTRY)&_ZN8S3610C102v9Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v10Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v11Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v12Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v13Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v14Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v15Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v16Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v17Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v18Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v19Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v20Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v21Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v22Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v23Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v24Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v25Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v26Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v27Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v28Ev,
  (VTBL_ENTRY)&_ZN8S3610C103v29Ev,
};
extern VTBL_ENTRY _ZTI7S3610C1[];
extern  VTBL_ENTRY _ZTV7S3610C1[];
Class_Descriptor cd_S3610C1 = {  "S3610C1", // class name
  bases_S3610C1, 3,
  &(vtc_S3610C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(376,268), // object size
  NSPAIRA(_ZTI7S3610C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3610C1),38, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10101C2  {
  virtual  ~S10101C2(); // _ZN8S10101C2D1Ev
  virtual void  v6(); // _ZN8S10101C22v6Ev
  S10101C2(); // tgen
};
//SIG(-1 S10101C2) C1{ vd v1}


 S10101C2 ::~S10101C2(){ note_dtor("S10101C2", this);}
void  S10101C2 ::v6(){vfunc_called(this, "_ZN8S10101C22v6Ev");}
S10101C2 ::S10101C2(){ note_ctor("S10101C2", this);} // tgen

static void Test_S10101C2()
{
  extern Class_Descriptor cd_S10101C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S10101C2, buf);
    S10101C2 *dp, &lv = *(dp=new (buf) S10101C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S10101C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10101C2)");
    test_class_info(&lv, &cd_S10101C2);
    dp->~S10101C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10101C2(Test_S10101C2, "S10101C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S10101C2C1Ev();
extern void _ZN8S10101C2D1Ev();
Name_Map name_map_S10101C2[] = {
  NSPAIR(_ZN8S10101C2C1Ev),
  NSPAIR(_ZN8S10101C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10101C2[];
extern void _ZN8S10101C2D1Ev();
extern void _ZN8S10101C2D0Ev();
extern void _ZN8S10101C22v6Ev();
static  VTBL_ENTRY vtc_S10101C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10101C2[0]),
  (VTBL_ENTRY)&_ZN8S10101C2D1Ev,
  (VTBL_ENTRY)&_ZN8S10101C2D0Ev,
  (VTBL_ENTRY)&_ZN8S10101C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S10101C2[];
extern  VTBL_ENTRY _ZTV8S10101C2[];
Class_Descriptor cd_S10101C2 = {  "S10101C2", // class name
  0,0,//no base classes
  &(vtc_S10101C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S10101C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10101C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10101C3  {
  void *s10101c3f0;
  virtual  ~S10101C3(); // _ZN8S10101C3D1Ev
  virtual void  v7(); // _ZN8S10101C32v7Ev
  virtual void  v8(); // _ZN8S10101C32v8Ev
  virtual void  v9(); // _ZN8S10101C32v9Ev
  virtual void  v10(); // _ZN8S10101C33v10Ev
  virtual void  v11(); // _ZN8S10101C33v11Ev
  S10101C3(); // tgen
};
//SIG(-1 S10101C3) C1{ vd v1 v2 v3 v4 v5 Fp}


 S10101C3 ::~S10101C3(){ note_dtor("S10101C3", this);}
void  S10101C3 ::v7(){vfunc_called(this, "_ZN8S10101C32v7Ev");}
void  S10101C3 ::v8(){vfunc_called(this, "_ZN8S10101C32v8Ev");}
void  S10101C3 ::v9(){vfunc_called(this, "_ZN8S10101C32v9Ev");}
void  S10101C3 ::v10(){vfunc_called(this, "_ZN8S10101C33v10Ev");}
void  S10101C3 ::v11(){vfunc_called(this, "_ZN8S10101C33v11Ev");}
S10101C3 ::S10101C3(){ note_ctor("S10101C3", this);} // tgen

static void Test_S10101C3()
{
  extern Class_Descriptor cd_S10101C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_S10101C3, buf);
    S10101C3 *dp, &lv = *(dp=new (buf) S10101C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S10101C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10101C3)");
    check_field_offset(lv, s10101c3f0, ABISELECT(8,4), "S10101C3.s10101c3f0");
    test_class_info(&lv, &cd_S10101C3);
    dp->~S10101C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10101C3(Test_S10101C3, "S10101C3", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN8S10101C3C1Ev();
extern void _ZN8S10101C3D1Ev();
Name_Map name_map_S10101C3[] = {
  NSPAIR(_ZN8S10101C3C1Ev),
  NSPAIR(_ZN8S10101C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S10101C3[];
extern void _ZN8S10101C3D1Ev();
extern void _ZN8S10101C3D0Ev();
extern void _ZN8S10101C32v7Ev();
extern void _ZN8S10101C32v8Ev();
extern void _ZN8S10101C32v9Ev();
extern void _ZN8S10101C33v10Ev();
extern void _ZN8S10101C33v11Ev();
static  VTBL_ENTRY vtc_S10101C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10101C3[0]),
  (VTBL_ENTRY)&_ZN8S10101C3D1Ev,
  (VTBL_ENTRY)&_ZN8S10101C3D0Ev,
  (VTBL_ENTRY)&_ZN8S10101C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10101C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10101C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10101C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10101C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10101C3[];
extern  VTBL_ENTRY _ZTV8S10101C3[];
Class_Descriptor cd_S10101C3 = {  "S10101C3", // class name
  0,0,//no base classes
  &(vtc_S10101C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI8S10101C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S10101C3),9, //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

struct  S10101C1  : S10101C2 , S10101C3 {
  ::S10103C49 s10101c1f0;
  ::S10103C56 s10101c1f1;
  ::S10103C47 s10101c1f2;
  ::S10103C57 s10101c1f3;
  ::S10103C50 s10101c1f4;
  ::S10098C34 s10101c1f5;
  void *s10101c1f6[5];
  virtual  ~S10101C1(); // _ZN8S10101C1D1Ev
  virtual void  v1(); // _ZN8S10101C12v1Ev
  virtual void  v2(); // _ZN8S10101C12v2Ev
  virtual void  v3(); // _ZN8S10101C12v3Ev
  virtual void  v4(); // _ZN8S10101C12v4Ev
  virtual void  v5(); // _ZN8S10101C12v5Ev
  S10101C1(); // tgen
};
//SIG(1 S10101C1) C1{ BC2{ vd v6} BC3{ vd v7 v8 v9 v10 v11 Fp} vd v1 v2 v3 v4 v5 FC4{ BC5{ BC6{ vd m FC7{ m Fp Fi FC8{ m} FC8} FC7 Fc} vd v14 v15 v16 v17 FC9{ m Fp FC10{ m FC11{ m Fp Fi FC12{ m}} Fi} FC11 FC11 Fi} Fp Fc Fi} v12 v13} FC13{ BC5 v18} FC14{ BC5 v19} FC15{ BC5 v20 v21 v22 Fp} FC16{ BC6 vd} FC17{ BC18{ vd m FC19{ m Fp Fi[2] FC20{ m}} FC19} vd} Fp[5]}


 S10101C1 ::~S10101C1(){ note_dtor("S10101C1", this);}
void  S10101C1 ::v1(){vfunc_called(this, "_ZN8S10101C12v1Ev");}
void  S10101C1 ::v2(){vfunc_called(this, "_ZN8S10101C12v2Ev");}
void  S10101C1 ::v3(){vfunc_called(this, "_ZN8S10101C12v3Ev");}
void  S10101C1 ::v4(){vfunc_called(this, "_ZN8S10101C12v4Ev");}
void  S10101C1 ::v5(){vfunc_called(this, "_ZN8S10101C12v5Ev");}
S10101C1 ::S10101C1(){ note_ctor("S10101C1", this);} // tgen

static void Test_S10101C1()
{
  extern Class_Descriptor cd_S10101C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(91,119)];
    init_test(&cd_S10101C1, buf);
    S10101C1 *dp, &lv = *(dp=new (buf) S10101C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(720,472), "sizeof(S10101C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10101C1)");
    check_base_class_offset(lv, (S10101C2*), 0, "S10101C1");
    check_base_class_offset(lv, (S10101C3*), ABISELECT(8,4), "S10101C1");
    check_field_offset(lv, s10101c1f0, ABISELECT(24,12), "S10101C1.s10101c1f0");
    check_field_offset(lv, s10101c1f1, ABISELECT(160,104), "S10101C1.s10101c1f1");
    check_field_offset(lv, s10101c1f2, ABISELECT(296,196), "S10101C1.s10101c1f2");
    check_field_offset(lv, s10101c1f3, ABISELECT(432,288), "S10101C1.s10101c1f3");
    check_field_offset(lv, s10101c1f4, ABISELECT(576,384), "S10101C1.s10101c1f4");
    check_field_offset(lv, s10101c1f5, ABISELECT(624,416), "S10101C1.s10101c1f5");
    check_field_offset(lv, s10101c1f6, ABISELECT(680,452), "S10101C1.s10101c1f6");
    test_class_info(&lv, &cd_S10101C1);
    dp->~S10101C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10101C1(Test_S10101C1, "S10101C1", ABISELECT(720,472));

#else // __cplusplus

extern void _ZN8S10101C1C1Ev();
extern void _ZN8S10101C1D1Ev();
Name_Map name_map_S10101C1[] = {
  NSPAIR(_ZN8S10101C1C1Ev),
  NSPAIR(_ZN8S10101C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10101C2;
extern VTBL_ENTRY _ZTI8S10101C2[];
extern  VTBL_ENTRY _ZTV8S10101C2[];
extern Class_Descriptor cd_S10101C3;
extern VTBL_ENTRY _ZTI8S10101C3[];
extern  VTBL_ENTRY _ZTV8S10101C3[];
static Base_Class bases_S10101C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10101C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S10101C3,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10101C1[];
extern void _ZN8S10101C1D1Ev();
extern void _ZN8S10101C1D0Ev();
extern void _ZN8S10101C22v6Ev();
extern void _ZN8S10101C12v1Ev();
extern void _ZN8S10101C12v2Ev();
extern void _ZN8S10101C12v3Ev();
extern void _ZN8S10101C12v4Ev();
extern void _ZN8S10101C12v5Ev();
extern void ABISELECT(_ZThn8_N8S10101C1D1Ev,_ZThn4_N8S10101C1D1Ev)();
extern void ABISELECT(_ZThn8_N8S10101C1D0Ev,_ZThn4_N8S10101C1D0Ev)();
extern void _ZN8S10101C32v7Ev();
extern void _ZN8S10101C32v8Ev();
extern void _ZN8S10101C32v9Ev();
extern void _ZN8S10101C33v10Ev();
extern void _ZN8S10101C33v11Ev();
static  VTBL_ENTRY vtc_S10101C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10101C1[0]),
  (VTBL_ENTRY)&_ZN8S10101C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10101C1D0Ev,
  (VTBL_ENTRY)&_ZN8S10101C22v6Ev,
  (VTBL_ENTRY)&_ZN8S10101C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10101C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10101C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10101C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10101C12v5Ev,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTI8S10101C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10101C1D1Ev,_ZThn4_N8S10101C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N8S10101C1D0Ev,_ZThn4_N8S10101C1D0Ev),
  (VTBL_ENTRY)&_ZN8S10101C32v7Ev,
  (VTBL_ENTRY)&_ZN8S10101C32v8Ev,
  (VTBL_ENTRY)&_ZN8S10101C32v9Ev,
  (VTBL_ENTRY)&_ZN8S10101C33v10Ev,
  (VTBL_ENTRY)&_ZN8S10101C33v11Ev,
};
extern VTBL_ENTRY _ZTI8S10101C1[];
extern  VTBL_ENTRY _ZTV8S10101C1[];
Class_Descriptor cd_S10101C1 = {  "S10101C1", // class name
  bases_S10101C1, 2,
  &(vtc_S10101C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(720,472), // object size
  NSPAIRA(_ZTI8S10101C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S10101C1),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3595C10  {
  void *s3595c10f0;
  ::S10103C13_nt s3595c10f1;
  ::S10103C16_nt s3595c10f2;
  ::S10103C17 s3595c10f3;
  virtual  ~S3595C10(); // _ZN8S3595C10D1Ev
  virtual void  v2(); // _ZN8S3595C102v2Ev
  virtual void  v3(); // _ZN8S3595C102v3Ev
  virtual void  v4(); // _ZN8S3595C102v4Ev
  virtual void  v5(); // _ZN8S3595C102v5Ev
  virtual void  v6(); // _ZN8S3595C102v6Ev
  virtual void  v7(); // _ZN8S3595C102v7Ev
  virtual void  v8(); // _ZN8S3595C102v8Ev
  virtual void  v9(); // _ZN8S3595C102v9Ev
  virtual void  v10(); // _ZN8S3595C103v10Ev
  virtual void  v11(); // _ZN8S3595C103v11Ev
  virtual void  v12(); // _ZN8S3595C103v12Ev
  virtual void  v13(); // _ZN8S3595C103v13Ev
  virtual void  v14(); // _ZN8S3595C103v14Ev
  virtual void  v15(); // _ZN8S3595C103v15Ev
  virtual void  v16(); // _ZN8S3595C103v16Ev
  virtual void  v17(); // _ZN8S3595C103v17Ev
  virtual void  v18(); // _ZN8S3595C103v18Ev
  virtual void  v19(); // _ZN8S3595C103v19Ev
  virtual void  v20(); // _ZN8S3595C103v20Ev
  virtual void  v21(); // _ZN8S3595C103v21Ev
  virtual void  v22(); // _ZN8S3595C103v22Ev
  virtual void  v23(); // _ZN8S3595C103v23Ev
  virtual void  v24(); // _ZN8S3595C103v24Ev
  virtual void  v25(); // _ZN8S3595C103v25Ev
  S3595C10(); // tgen
};
//SIG(-1 S3595C10) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} FC5{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC6{ m Fc Fi[2] Fp}}


 S3595C10 ::~S3595C10(){ note_dtor("S3595C10", this);}
void  S3595C10 ::v2(){vfunc_called(this, "_ZN8S3595C102v2Ev");}
void  S3595C10 ::v3(){vfunc_called(this, "_ZN8S3595C102v3Ev");}
void  S3595C10 ::v4(){vfunc_called(this, "_ZN8S3595C102v4Ev");}
void  S3595C10 ::v5(){vfunc_called(this, "_ZN8S3595C102v5Ev");}
void  S3595C10 ::v6(){vfunc_called(this, "_ZN8S3595C102v6Ev");}
void  S3595C10 ::v7(){vfunc_called(this, "_ZN8S3595C102v7Ev");}
void  S3595C10 ::v8(){vfunc_called(this, "_ZN8S3595C102v8Ev");}
void  S3595C10 ::v9(){vfunc_called(this, "_ZN8S3595C102v9Ev");}
void  S3595C10 ::v10(){vfunc_called(this, "_ZN8S3595C103v10Ev");}
void  S3595C10 ::v11(){vfunc_called(this, "_ZN8S3595C103v11Ev");}
void  S3595C10 ::v12(){vfunc_called(this, "_ZN8S3595C103v12Ev");}
void  S3595C10 ::v13(){vfunc_called(this, "_ZN8S3595C103v13Ev");}
void  S3595C10 ::v14(){vfunc_called(this, "_ZN8S3595C103v14Ev");}
void  S3595C10 ::v15(){vfunc_called(this, "_ZN8S3595C103v15Ev");}
void  S3595C10 ::v16(){vfunc_called(this, "_ZN8S3595C103v16Ev");}
void  S3595C10 ::v17(){vfunc_called(this, "_ZN8S3595C103v17Ev");}
void  S3595C10 ::v18(){vfunc_called(this, "_ZN8S3595C103v18Ev");}
void  S3595C10 ::v19(){vfunc_called(this, "_ZN8S3595C103v19Ev");}
void  S3595C10 ::v20(){vfunc_called(this, "_ZN8S3595C103v20Ev");}
void  S3595C10 ::v21(){vfunc_called(this, "_ZN8S3595C103v21Ev");}
void  S3595C10 ::v22(){vfunc_called(this, "_ZN8S3595C103v22Ev");}
void  S3595C10 ::v23(){vfunc_called(this, "_ZN8S3595C103v23Ev");}
void  S3595C10 ::v24(){vfunc_called(this, "_ZN8S3595C103v24Ev");}
void  S3595C10 ::v25(){vfunc_called(this, "_ZN8S3595C103v25Ev");}
S3595C10 ::S3595C10(){ note_ctor("S3595C10", this);} // tgen

static void Test_S3595C10()
{
  extern Class_Descriptor cd_S3595C10;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,21)];
    init_test(&cd_S3595C10, buf);
    S3595C10 *dp, &lv = *(dp=new (buf) S3595C10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,80), "sizeof(S3595C10)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3595C10)");
    check_field_offset(lv, s3595c10f0, ABISELECT(8,4), "S3595C10.s3595c10f0");
    check_field_offset(lv, s3595c10f1, ABISELECT(16,8), "S3595C10.s3595c10f1");
    check_field_offset(lv, s3595c10f2, ABISELECT(40,24), "S3595C10.s3595c10f2");
    check_field_offset(lv, s3595c10f3, ABISELECT(96,64), "S3595C10.s3595c10f3");
    test_class_info(&lv, &cd_S3595C10);
    dp->~S3595C10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3595C10(Test_S3595C10, "S3595C10", ABISELECT(120,80));

#else // __cplusplus

extern void _ZN8S3595C10C1Ev();
extern void _ZN8S3595C10D1Ev();
Name_Map name_map_S3595C10[] = {
  NSPAIR(_ZN8S3595C10C1Ev),
  NSPAIR(_ZN8S3595C10D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S3595C10[];
extern void _ZN8S3595C10D1Ev();
extern void _ZN8S3595C10D0Ev();
extern void _ZN8S3595C102v2Ev();
extern void _ZN8S3595C102v3Ev();
extern void _ZN8S3595C102v4Ev();
extern void _ZN8S3595C102v5Ev();
extern void _ZN8S3595C102v6Ev();
extern void _ZN8S3595C102v7Ev();
extern void _ZN8S3595C102v8Ev();
extern void _ZN8S3595C102v9Ev();
extern void _ZN8S3595C103v10Ev();
extern void _ZN8S3595C103v11Ev();
extern void _ZN8S3595C103v12Ev();
extern void _ZN8S3595C103v13Ev();
extern void _ZN8S3595C103v14Ev();
extern void _ZN8S3595C103v15Ev();
extern void _ZN8S3595C103v16Ev();
extern void _ZN8S3595C103v17Ev();
extern void _ZN8S3595C103v18Ev();
extern void _ZN8S3595C103v19Ev();
extern void _ZN8S3595C103v20Ev();
extern void _ZN8S3595C103v21Ev();
extern void _ZN8S3595C103v22Ev();
extern void _ZN8S3595C103v23Ev();
extern void _ZN8S3595C103v24Ev();
extern void _ZN8S3595C103v25Ev();
static  VTBL_ENTRY vtc_S3595C10[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S3595C10[0]),
  (VTBL_ENTRY)&_ZN8S3595C10D1Ev,
  (VTBL_ENTRY)&_ZN8S3595C10D0Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v2Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v3Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v4Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v5Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v6Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v7Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v8Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v9Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v10Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v11Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v12Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v13Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v14Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v15Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v16Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v17Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v18Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v19Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v20Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v21Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v22Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v23Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v24Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v25Ev,
};
extern VTBL_ENTRY _ZTI8S3595C10[];
extern  VTBL_ENTRY _ZTV8S3595C10[];
Class_Descriptor cd_S3595C10 = {  "S3595C10", // class name
  0,0,//no base classes
  &(vtc_S3595C10[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(120,80), // object size
  NSPAIRA(_ZTI8S3595C10),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S3595C10),28, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3595C2  : S10103C5_nt , S3595C10 {
  int s3595c2f0;
  ::S10103C13_nt s3595c2f1;
  int s3595c2f2;
  ::S10103C105 s3595c2f3;
  ::S10103C105 s3595c2f4;
  ::S10103C25_nt s3595c2f5[2];
  ::S10103C25_nt s3595c2f6[2];
  ::S10103C14_nt s3595c2f7;
  virtual  ~S3595C2(); // _ZN7S3595C2D1Ev
  virtual void  v26(); // _ZN7S3595C23v26Ev
  S3595C2(); // tgen
};
//SIG(-1 S3595C2) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m} FC4} FC3 Fc} BC5{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 Fp FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} FC9{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC10{ m Fc Fi[2] Fp}} vd v1 Fi FC6 Fi FC11{ m Fp} FC11 FC12{ Fi[4]}[2] FC12[2] FC7}


 S3595C2 ::~S3595C2(){ note_dtor("S3595C2", this);}
void  S3595C2 ::v26(){vfunc_called(this, "_ZN7S3595C23v26Ev");}
S3595C2 ::S3595C2(){ note_ctor("S3595C2", this);} // tgen

static void Test_S3595C2()
{
  extern Class_Descriptor cd_S3595C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(39,56)];
    init_test(&cd_S3595C2, buf);
    S3595C2 *dp, &lv = *(dp=new (buf) S3595C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(304,220), "sizeof(S3595C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3595C2)");
    check_base_class_offset(lv, (S10103C5_nt*), 0, "S3595C2");
    check_base_class_offset(lv, (S3595C10*), ABISELECT(48,32), "S3595C2");
    check_field_offset(lv, s3595c2f0, ABISELECT(168,112), "S3595C2.s3595c2f0");
    check_field_offset(lv, s3595c2f1, ABISELECT(176,116), "S3595C2.s3595c2f1");
    check_field_offset(lv, s3595c2f2, ABISELECT(200,132), "S3595C2.s3595c2f2");
    check_field_offset(lv, s3595c2f3, ABISELECT(208,136), "S3595C2.s3595c2f3");
    check_field_offset(lv, s3595c2f4, ABISELECT(216,140), "S3595C2.s3595c2f4");
    check_field_offset(lv, s3595c2f5, ABISELECT(224,144), "S3595C2.s3595c2f5");
    check_field_offset(lv, s3595c2f6, ABISELECT(256,176), "S3595C2.s3595c2f6");
    check_field_offset(lv, s3595c2f7, ABISELECT(288,208), "S3595C2.s3595c2f7");
    test_class_info(&lv, &cd_S3595C2);
    dp->~S3595C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3595C2(Test_S3595C2, "S3595C2", ABISELECT(304,220));

#else // __cplusplus

extern void _ZN7S3595C2C1Ev();
extern void _ZN7S3595C2D1Ev();
Name_Map name_map_S3595C2[] = {
  NSPAIR(_ZN7S3595C2C1Ev),
  NSPAIR(_ZN7S3595C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S3595C10;
extern VTBL_ENTRY _ZTI8S3595C10[];
extern  VTBL_ENTRY _ZTV8S3595C10[];
static Base_Class bases_S3595C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S3595C10,    ABISELECT(48,32), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3595C2[];
extern void _ZN7S3595C2D1Ev();
extern void _ZN7S3595C2D0Ev();
extern void _ZN7S3595C23v26Ev();
extern void ABISELECT(_ZThn48_N7S3595C2D1Ev,_ZThn32_N7S3595C2D1Ev)();
extern void ABISELECT(_ZThn48_N7S3595C2D0Ev,_ZThn32_N7S3595C2D0Ev)();
extern void _ZN8S3595C102v2Ev();
extern void _ZN8S3595C102v3Ev();
extern void _ZN8S3595C102v4Ev();
extern void _ZN8S3595C102v5Ev();
extern void _ZN8S3595C102v6Ev();
extern void _ZN8S3595C102v7Ev();
extern void _ZN8S3595C102v8Ev();
extern void _ZN8S3595C102v9Ev();
extern void _ZN8S3595C103v10Ev();
extern void _ZN8S3595C103v11Ev();
extern void _ZN8S3595C103v12Ev();
extern void _ZN8S3595C103v13Ev();
extern void _ZN8S3595C103v14Ev();
extern void _ZN8S3595C103v15Ev();
extern void _ZN8S3595C103v16Ev();
extern void _ZN8S3595C103v17Ev();
extern void _ZN8S3595C103v18Ev();
extern void _ZN8S3595C103v19Ev();
extern void _ZN8S3595C103v20Ev();
extern void _ZN8S3595C103v21Ev();
extern void _ZN8S3595C103v22Ev();
extern void _ZN8S3595C103v23Ev();
extern void _ZN8S3595C103v24Ev();
extern void _ZN8S3595C103v25Ev();
static  VTBL_ENTRY vtc_S3595C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3595C2[0]),
  (VTBL_ENTRY)&_ZN7S3595C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3595C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3595C23v26Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7S3595C2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3595C2D1Ev,_ZThn32_N7S3595C2D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3595C2D0Ev,_ZThn32_N7S3595C2D0Ev),
  (VTBL_ENTRY)&_ZN8S3595C102v2Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v3Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v4Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v5Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v6Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v7Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v8Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v9Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v10Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v11Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v12Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v13Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v14Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v15Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v16Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v17Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v18Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v19Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v20Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v21Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v22Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v23Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v24Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v25Ev,
};
extern VTBL_ENTRY _ZTI7S3595C2[];
extern  VTBL_ENTRY _ZTV7S3595C2[];
Class_Descriptor cd_S3595C2 = {  "S3595C2", // class name
  bases_S3595C2, 2,
  &(vtc_S3595C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(304,220), // object size
  NSPAIRA(_ZTI7S3595C2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7S3595C2),33, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3595C1  : S3595C2 {
  void *s3595c1f0;
  int s3595c1f1;
  virtual  ~S3595C1(); // _ZN7S3595C1D1Ev
  virtual void  v1(); // _ZN7S3595C12v1Ev
  S3595C1(); // tgen
};
//SIG(1 S3595C1) C1{ BC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m} FC5} FC4 Fc} BC6{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 Fp FC7{ m FC8{ m Fp Fi FC9{ m}} Fi} FC10{ m Fi[4] Fp Fc Fi[2] Fp[2]} FC11{ m Fc Fi[2] Fp}} vd v26 Fi FC7 Fi FC12{ m Fp} FC12 FC13{ Fi[4]}[2] FC13[2] FC8} vd v1 Fp Fi}


 S3595C1 ::~S3595C1(){ note_dtor("S3595C1", this);}
void  S3595C1 ::v1(){vfunc_called(this, "_ZN7S3595C12v1Ev");}
S3595C1 ::S3595C1(){ note_ctor("S3595C1", this);} // tgen

static void Test_S3595C1()
{
  extern Class_Descriptor cd_S3595C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(41,58)];
    init_test(&cd_S3595C1, buf);
    S3595C1 *dp, &lv = *(dp=new (buf) S3595C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(320,228), "sizeof(S3595C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3595C1)");
    check_base_class_offset(lv, (S10103C5_nt*)(S3595C2*), 0, "S3595C1");
    check_base_class_offset(lv, (S3595C10*)(S3595C2*), ABISELECT(48,32), "S3595C1");
    check_base_class_offset(lv, (S3595C2*), 0, "S3595C1");
    check_field_offset(lv, s3595c1f0, ABISELECT(304,220), "S3595C1.s3595c1f0");
    check_field_offset(lv, s3595c1f1, ABISELECT(312,224), "S3595C1.s3595c1f1");
    test_class_info(&lv, &cd_S3595C1);
    dp->~S3595C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3595C1(Test_S3595C1, "S3595C1", ABISELECT(320,228));

#else // __cplusplus

extern void _ZN7S3595C1C1Ev();
extern void _ZN7S3595C1D1Ev();
Name_Map name_map_S3595C1[] = {
  NSPAIR(_ZN7S3595C1C1Ev),
  NSPAIR(_ZN7S3595C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C5_nt;
extern VTBL_ENTRY _ZTI11S10103C5_nt[];
extern  VTBL_ENTRY _ZTV11S10103C5_nt[];
extern Class_Descriptor cd_S3595C10;
extern VTBL_ENTRY _ZTI8S3595C10[];
extern  VTBL_ENTRY _ZTV8S3595C10[];
extern Class_Descriptor cd_S3595C2;
extern VTBL_ENTRY _ZTI7S3595C2[];
extern  VTBL_ENTRY _ZTV7S3595C2[];
static Base_Class bases_S3595C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S3595C10,    ABISELECT(48,32), //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
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S3595C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3595C1[];
extern void _ZN7S3595C1D1Ev();
extern void _ZN7S3595C1D0Ev();
extern void _ZN7S3595C23v26Ev();
extern void _ZN7S3595C12v1Ev();
extern void ABISELECT(_ZThn48_N7S3595C1D1Ev,_ZThn32_N7S3595C1D1Ev)();
extern void ABISELECT(_ZThn48_N7S3595C1D0Ev,_ZThn32_N7S3595C1D0Ev)();
extern void _ZN8S3595C102v2Ev();
extern void _ZN8S3595C102v3Ev();
extern void _ZN8S3595C102v4Ev();
extern void _ZN8S3595C102v5Ev();
extern void _ZN8S3595C102v6Ev();
extern void _ZN8S3595C102v7Ev();
extern void _ZN8S3595C102v8Ev();
extern void _ZN8S3595C102v9Ev();
extern void _ZN8S3595C103v10Ev();
extern void _ZN8S3595C103v11Ev();
extern void _ZN8S3595C103v12Ev();
extern void _ZN8S3595C103v13Ev();
extern void _ZN8S3595C103v14Ev();
extern void _ZN8S3595C103v15Ev();
extern void _ZN8S3595C103v16Ev();
extern void _ZN8S3595C103v17Ev();
extern void _ZN8S3595C103v18Ev();
extern void _ZN8S3595C103v19Ev();
extern void _ZN8S3595C103v20Ev();
extern void _ZN8S3595C103v21Ev();
extern void _ZN8S3595C103v22Ev();
extern void _ZN8S3595C103v23Ev();
extern void _ZN8S3595C103v24Ev();
extern void _ZN8S3595C103v25Ev();
static  VTBL_ENTRY vtc_S3595C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3595C1[0]),
  (VTBL_ENTRY)&_ZN7S3595C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3595C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3595C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3595C12v1Ev,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7S3595C1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3595C1D1Ev,_ZThn32_N7S3595C1D1Ev),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N7S3595C1D0Ev,_ZThn32_N7S3595C1D0Ev),
  (VTBL_ENTRY)&_ZN8S3595C102v2Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v3Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v4Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v5Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v6Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v7Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v8Ev,
  (VTBL_ENTRY)&_ZN8S3595C102v9Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v10Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v11Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v12Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v13Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v14Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v15Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v16Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v17Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v18Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v19Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v20Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v21Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v22Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v23Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v24Ev,
  (VTBL_ENTRY)&_ZN8S3595C103v25Ev,
};
extern VTBL_ENTRY _ZTI7S3595C1[];
extern  VTBL_ENTRY _ZTV7S3595C1[];
Class_Descriptor cd_S3595C1 = {  "S3595C1", // class name
  bases_S3595C1, 3,
  &(vtc_S3595C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(320,228), // object size
  NSPAIRA(_ZTI7S3595C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3595C1),34, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S644C5  {
  void *s644c5f0[2];
  ::S10103C13_nt s644c5f1;
  void *s644c5f2;
  virtual  ~S644C5(); // _ZN6S644C5D1Ev
  virtual void  v5(); // _ZN6S644C52v5Ev
  virtual void  v6(); // _ZN6S644C52v6Ev
  virtual void  v7(); // _ZN6S644C52v7Ev
  virtual void  v8(); // _ZN6S644C52v8Ev
  virtual void  v9(); // _ZN6S644C52v9Ev
  virtual void  v10(); // _ZN6S644C53v10Ev
  virtual void  v11(); // _ZN6S644C53v11Ev
  virtual void  v12(); // _ZN6S644C53v12Ev
  virtual void  v13(); // _ZN6S644C53v13Ev
  virtual void  v14(); // _ZN6S644C53v14Ev
  S644C5(); // tgen
};
//SIG(-1 S644C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S644C5 ::~S644C5(){ note_dtor("S644C5", this);}
void  S644C5 ::v5(){vfunc_called(this, "_ZN6S644C52v5Ev");}
void  S644C5 ::v6(){vfunc_called(this, "_ZN6S644C52v6Ev");}
void  S644C5 ::v7(){vfunc_called(this, "_ZN6S644C52v7Ev");}
void  S644C5 ::v8(){vfunc_called(this, "_ZN6S644C52v8Ev");}
void  S644C5 ::v9(){vfunc_called(this, "_ZN6S644C52v9Ev");}
void  S644C5 ::v10(){vfunc_called(this, "_ZN6S644C53v10Ev");}
void  S644C5 ::v11(){vfunc_called(this, "_ZN6S644C53v11Ev");}
void  S644C5 ::v12(){vfunc_called(this, "_ZN6S644C53v12Ev");}
void  S644C5 ::v13(){vfunc_called(this, "_ZN6S644C53v13Ev");}
void  S644C5 ::v14(){vfunc_called(this, "_ZN6S644C53v14Ev");}
S644C5 ::S644C5(){ note_ctor("S644C5", this);} // tgen

static void Test_S644C5()
{
  extern Class_Descriptor cd_S644C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S644C5, buf);
    S644C5 *dp, &lv = *(dp=new (buf) S644C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S644C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S644C5)");
    check_field_offset(lv, s644c5f0, ABISELECT(8,4), "S644C5.s644c5f0");
    check_field_offset(lv, s644c5f1, ABISELECT(24,12), "S644C5.s644c5f1");
    check_field_offset(lv, s644c5f2, ABISELECT(48,28), "S644C5.s644c5f2");
    test_class_info(&lv, &cd_S644C5);
    dp->~S644C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS644C5(Test_S644C5, "S644C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S644C5C1Ev();
extern void _ZN6S644C5D1Ev();
Name_Map name_map_S644C5[] = {
  NSPAIR(_ZN6S644C5C1Ev),
  NSPAIR(_ZN6S644C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S644C5[];
extern void _ZN6S644C5D1Ev();
extern void _ZN6S644C5D0Ev();
extern void _ZN6S644C52v5Ev();
extern void _ZN6S644C52v6Ev();
extern void _ZN6S644C52v7Ev();
extern void _ZN6S644C52v8Ev();
extern void _ZN6S644C52v9Ev();
extern void _ZN6S644C53v10Ev();
extern void _ZN6S644C53v11Ev();
extern void _ZN6S644C53v12Ev();
extern void _ZN6S644C53v13Ev();
extern void _ZN6S644C53v14Ev();
static  VTBL_ENTRY vtc_S644C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S644C5[0]),
  (VTBL_ENTRY)&_ZN6S644C5D1Ev,
  (VTBL_ENTRY)&_ZN6S644C5D0Ev,
  (VTBL_ENTRY)&_ZN6S644C52v5Ev,
  (VTBL_ENTRY)&_ZN6S644C52v6Ev,
  (VTBL_ENTRY)&_ZN6S644C52v7Ev,
  (VTBL_ENTRY)&_ZN6S644C52v8Ev,
  (VTBL_ENTRY)&_ZN6S644C52v9Ev,
  (VTBL_ENTRY)&_ZN6S644C53v10Ev,
  (VTBL_ENTRY)&_ZN6S644C53v11Ev,
  (VTBL_ENTRY)&_ZN6S644C53v12Ev,
  (VTBL_ENTRY)&_ZN6S644C53v13Ev,
  (VTBL_ENTRY)&_ZN6S644C53v14Ev,
};
extern VTBL_ENTRY _ZTI6S644C5[];
extern  VTBL_ENTRY _ZTV6S644C5[];
Class_Descriptor cd_S644C5 = {  "S644C5", // class name
  0,0,//no base classes
  &(vtc_S644C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S644C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S644C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S644C4  : S644C5 {
  void *s644c4f0;
  ::S10103C13_nt s644c4f1;
  ::S10103C13_nt s644c4f2;
  ::S10103C13_nt s644c4f3;
  ::S10103C86 s644c4f4;
  ::S10103C86 s644c4f5;
  ::S10103C86 s644c4f6;
  virtual  ~S644C4(); // _ZN6S644C4D1Ev
  virtual void  v15(); // _ZN6S644C43v15Ev
  virtual void  v16(); // _ZN6S644C43v16Ev
  virtual void  v17(); // _ZN6S644C43v17Ev
  virtual void  v18(); // _ZN6S644C43v18Ev
  virtual void  v19(); // _ZN6S644C43v19Ev
  S644C4(); // tgen
};
//SIG(-1 S644C4) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S644C4 ::~S644C4(){ note_dtor("S644C4", this);}
void  S644C4 ::v15(){vfunc_called(this, "_ZN6S644C43v15Ev");}
void  S644C4 ::v16(){vfunc_called(this, "_ZN6S644C43v16Ev");}
void  S644C4 ::v17(){vfunc_called(this, "_ZN6S644C43v17Ev");}
void  S644C4 ::v18(){vfunc_called(this, "_ZN6S644C43v18Ev");}
void  S644C4 ::v19(){vfunc_called(this, "_ZN6S644C43v19Ev");}
S644C4 ::S644C4(){ note_ctor("S644C4", this);} // tgen

static void Test_S644C4()
{
  extern Class_Descriptor cd_S644C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S644C4, buf);
    S644C4 *dp, &lv = *(dp=new (buf) S644C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S644C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S644C4)");
    check_base_class_offset(lv, (S644C5*), 0, "S644C4");
    check_field_offset(lv, s644c4f0, ABISELECT(56,32), "S644C4.s644c4f0");
    check_field_offset(lv, s644c4f1, ABISELECT(64,36), "S644C4.s644c4f1");
    check_field_offset(lv, s644c4f2, ABISELECT(88,52), "S644C4.s644c4f2");
    check_field_offset(lv, s644c4f3, ABISELECT(112,68), "S644C4.s644c4f3");
    check_field_offset(lv, s644c4f4, ABISELECT(136,84), "S644C4.s644c4f4");
    check_field_offset(lv, s644c4f5, ABISELECT(152,96), "S644C4.s644c4f5");
    check_field_offset(lv, s644c4f6, ABISELECT(168,108), "S644C4.s644c4f6");
    test_class_info(&lv, &cd_S644C4);
    dp->~S644C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS644C4(Test_S644C4, "S644C4", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN6S644C4C1Ev();
extern void _ZN6S644C4D1Ev();
Name_Map name_map_S644C4[] = {
  NSPAIR(_ZN6S644C4C1Ev),
  NSPAIR(_ZN6S644C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S644C5;
extern VTBL_ENTRY _ZTI6S644C5[];
extern  VTBL_ENTRY _ZTV6S644C5[];
static Base_Class bases_S644C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S644C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S644C4[];
extern void _ZN6S644C4D1Ev();
extern void _ZN6S644C4D0Ev();
extern void _ZN6S644C52v5Ev();
extern void _ZN6S644C52v6Ev();
extern void _ZN6S644C52v7Ev();
extern void _ZN6S644C52v8Ev();
extern void _ZN6S644C52v9Ev();
extern void _ZN6S644C53v10Ev();
extern void _ZN6S644C53v11Ev();
extern void _ZN6S644C53v12Ev();
extern void _ZN6S644C53v13Ev();
extern void _ZN6S644C53v14Ev();
extern void _ZN6S644C43v15Ev();
extern void _ZN6S644C43v16Ev();
extern void _ZN6S644C43v17Ev();
extern void _ZN6S644C43v18Ev();
extern void _ZN6S644C43v19Ev();
static  VTBL_ENTRY vtc_S644C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S644C4[0]),
  (VTBL_ENTRY)&_ZN6S644C4D1Ev,
  (VTBL_ENTRY)&_ZN6S644C4D0Ev,
  (VTBL_ENTRY)&_ZN6S644C52v5Ev,
  (VTBL_ENTRY)&_ZN6S644C52v6Ev,
  (VTBL_ENTRY)&_ZN6S644C52v7Ev,
  (VTBL_ENTRY)&_ZN6S644C52v8Ev,
  (VTBL_ENTRY)&_ZN6S644C52v9Ev,
  (VTBL_ENTRY)&_ZN6S644C53v10Ev,
  (VTBL_ENTRY)&_ZN6S644C53v11Ev,
  (VTBL_ENTRY)&_ZN6S644C53v12Ev,
  (VTBL_ENTRY)&_ZN6S644C53v13Ev,
  (VTBL_ENTRY)&_ZN6S644C53v14Ev,
  (VTBL_ENTRY)&_ZN6S644C43v15Ev,
  (VTBL_ENTRY)&_ZN6S644C43v16Ev,
  (VTBL_ENTRY)&_ZN6S644C43v17Ev,
  (VTBL_ENTRY)&_ZN6S644C43v18Ev,
  (VTBL_ENTRY)&_ZN6S644C43v19Ev,
};
extern VTBL_ENTRY _ZTI6S644C4[];
extern  VTBL_ENTRY _ZTV6S644C4[];
Class_Descriptor cd_S644C4 = {  "S644C4", // class name
  bases_S644C4, 1,
  &(vtc_S644C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI6S644C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S644C4),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S644C3  : S644C4 {
  char s644c3f0;
  virtual void  v20(); // _ZN6S644C33v20Ev
  virtual void  v21(); // _ZN6S644C33v21Ev
  virtual void  v22(); // _ZN6S644C33v22Ev
  virtual void  v23(); // _ZN6S644C33v23Ev
  ~S644C3(); // tgen
  S644C3(); // tgen
};
//SIG(-1 S644C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S644C3 ::v20(){vfunc_called(this, "_ZN6S644C33v20Ev");}
void  S644C3 ::v21(){vfunc_called(this, "_ZN6S644C33v21Ev");}
void  S644C3 ::v22(){vfunc_called(this, "_ZN6S644C33v22Ev");}
void  S644C3 ::v23(){vfunc_called(this, "_ZN6S644C33v23Ev");}
S644C3 ::~S644C3(){ note_dtor("S644C3", this);} // tgen
S644C3 ::S644C3(){ note_ctor("S644C3", this);} // tgen

static void Test_S644C3()
{
  extern Class_Descriptor cd_S644C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S644C3, buf);
    S644C3 *dp, &lv = *(dp=new (buf) S644C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S644C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S644C3)");
    check_base_class_offset(lv, (S644C5*)(S644C4*), 0, "S644C3");
    check_base_class_offset(lv, (S644C4*), 0, "S644C3");
    check_field_offset(lv, s644c3f0, ABISELECT(184,120), "S644C3.s644c3f0");
    test_class_info(&lv, &cd_S644C3);
    dp->~S644C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS644C3(Test_S644C3, "S644C3", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN6S644C3C1Ev();
extern void _ZN6S644C3D1Ev();
Name_Map name_map_S644C3[] = {
  NSPAIR(_ZN6S644C3C1Ev),
  NSPAIR(_ZN6S644C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S644C5;
extern VTBL_ENTRY _ZTI6S644C5[];
extern  VTBL_ENTRY _ZTV6S644C5[];
extern Class_Descriptor cd_S644C4;
extern VTBL_ENTRY _ZTI6S644C4[];
extern  VTBL_ENTRY _ZTV6S644C4[];
static Base_Class bases_S644C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S644C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S644C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S644C3[];
extern void _ZN6S644C3D1Ev();
extern void _ZN6S644C3D0Ev();
extern void _ZN6S644C52v5Ev();
extern void _ZN6S644C52v6Ev();
extern void _ZN6S644C52v7Ev();
extern void _ZN6S644C52v8Ev();
extern void _ZN6S644C52v9Ev();
extern void _ZN6S644C53v10Ev();
extern void _ZN6S644C53v11Ev();
extern void _ZN6S644C53v12Ev();
extern void _ZN6S644C53v13Ev();
extern void _ZN6S644C53v14Ev();
extern void _ZN6S644C43v15Ev();
extern void _ZN6S644C43v16Ev();
extern void _ZN6S644C43v17Ev();
extern void _ZN6S644C43v18Ev();
extern void _ZN6S644C43v19Ev();
extern void _ZN6S644C33v20Ev();
extern void _ZN6S644C33v21Ev();
extern void _ZN6S644C33v22Ev();
extern void _ZN6S644C33v23Ev();
static  VTBL_ENTRY vtc_S644C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S644C3[0]),
  (VTBL_ENTRY)&_ZN6S644C3D1Ev,
  (VTBL_ENTRY)&_ZN6S644C3D0Ev,
  (VTBL_ENTRY)&_ZN6S644C52v5Ev,
  (VTBL_ENTRY)&_ZN6S644C52v6Ev,
  (VTBL_ENTRY)&_ZN6S644C52v7Ev,
  (VTBL_ENTRY)&_ZN6S644C52v8Ev,
  (VTBL_ENTRY)&_ZN6S644C52v9Ev,
  (VTBL_ENTRY)&_ZN6S644C53v10Ev,
  (VTBL_ENTRY)&_ZN6S644C53v11Ev,
  (VTBL_ENTRY)&_ZN6S644C53v12Ev,
  (VTBL_ENTRY)&_ZN6S644C53v13Ev,
  (VTBL_ENTRY)&_ZN6S644C53v14Ev,
  (VTBL_ENTRY)&_ZN6S644C43v15Ev,
  (VTBL_ENTRY)&_ZN6S644C43v16Ev,
  (VTBL_ENTRY)&_ZN6S644C43v17Ev,
  (VTBL_ENTRY)&_ZN6S644C43v18Ev,
  (VTBL_ENTRY)&_ZN6S644C43v19Ev,
  (VTBL_ENTRY)&_ZN6S644C33v20Ev,
  (VTBL_ENTRY)&_ZN6S644C33v21Ev,
  (VTBL_ENTRY)&_ZN6S644C33v22Ev,
  (VTBL_ENTRY)&_ZN6S644C33v23Ev,
};
extern VTBL_ENTRY _ZTI6S644C3[];
extern  VTBL_ENTRY _ZTV6S644C3[];
Class_Descriptor cd_S644C3 = {  "S644C3", // class name
  bases_S644C3, 2,
  &(vtc_S644C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI6S644C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S644C3),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S644C2  : S644C3 {
  char s644c2f0;
  int s644c2f1;
  virtual void  v24(); // _ZN6S644C23v24Ev
  virtual void  v25(); // _ZN6S644C23v25Ev
  virtual void  v26(); // _ZN6S644C23v26Ev
  virtual void  v27(); // _ZN6S644C23v27Ev
  ~S644C2(); // tgen
  S644C2(); // tgen
};
//SIG(-1 S644C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fc} v1 v2 v3 v4 Fc Fi}


void  S644C2 ::v24(){vfunc_called(this, "_ZN6S644C23v24Ev");}
void  S644C2 ::v25(){vfunc_called(this, "_ZN6S644C23v25Ev");}
void  S644C2 ::v26(){vfunc_called(this, "_ZN6S644C23v26Ev");}
void  S644C2 ::v27(){vfunc_called(this, "_ZN6S644C23v27Ev");}
S644C2 ::~S644C2(){ note_dtor("S644C2", this);} // tgen
S644C2 ::S644C2(){ note_ctor("S644C2", this);} // tgen

static void Test_S644C2()
{
  extern Class_Descriptor cd_S644C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S644C2, buf);
    S644C2 *dp, &lv = *(dp=new (buf) S644C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S644C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S644C2)");
    check_base_class_offset(lv, (S644C5*)(S644C4*)(S644C3*), 0, "S644C2");
    check_base_class_offset(lv, (S644C4*)(S644C3*), 0, "S644C2");
    check_base_class_offset(lv, (S644C3*), 0, "S644C2");
    check_field_offset(lv, s644c2f0, ABISELECT(185,121), "S644C2.s644c2f0");
    check_field_offset(lv, s644c2f1, ABISELECT(188,124), "S644C2.s644c2f1");
    test_class_info(&lv, &cd_S644C2);
    dp->~S644C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS644C2(Test_S644C2, "S644C2", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN6S644C2C1Ev();
extern void _ZN6S644C2D1Ev();
Name_Map name_map_S644C2[] = {
  NSPAIR(_ZN6S644C2C1Ev),
  NSPAIR(_ZN6S644C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S644C5;
extern VTBL_ENTRY _ZTI6S644C5[];
extern  VTBL_ENTRY _ZTV6S644C5[];
extern Class_Descriptor cd_S644C4;
extern VTBL_ENTRY _ZTI6S644C4[];
extern  VTBL_ENTRY _ZTV6S644C4[];
extern Class_Descriptor cd_S644C3;
extern VTBL_ENTRY _ZTI6S644C3[];
extern  VTBL_ENTRY _ZTV6S644C3[];
static Base_Class bases_S644C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S644C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S644C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S644C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S644C2[];
extern void _ZN6S644C2D1Ev();
extern void _ZN6S644C2D0Ev();
extern void _ZN6S644C52v5Ev();
extern void _ZN6S644C52v6Ev();
extern void _ZN6S644C52v7Ev();
extern void _ZN6S644C52v8Ev();
extern void _ZN6S644C52v9Ev();
extern void _ZN6S644C53v10Ev();
extern void _ZN6S644C53v11Ev();
extern void _ZN6S644C53v12Ev();
extern void _ZN6S644C53v13Ev();
extern void _ZN6S644C53v14Ev();
extern void _ZN6S644C43v15Ev();
extern void _ZN6S644C43v16Ev();
extern void _ZN6S644C43v17Ev();
extern void _ZN6S644C43v18Ev();
extern void _ZN6S644C43v19Ev();
extern void _ZN6S644C33v20Ev();
extern void _ZN6S644C33v21Ev();
extern void _ZN6S644C33v22Ev();
extern void _ZN6S644C33v23Ev();
extern void _ZN6S644C23v24Ev();
extern void _ZN6S644C23v25Ev();
extern void _ZN6S644C23v26Ev();
extern void _ZN6S644C23v27Ev();
static  VTBL_ENTRY vtc_S644C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S644C2[0]),
  (VTBL_ENTRY)&_ZN6S644C2D1Ev,
  (VTBL_ENTRY)&_ZN6S644C2D0Ev,
  (VTBL_ENTRY)&_ZN6S644C52v5Ev,
  (VTBL_ENTRY)&_ZN6S644C52v6Ev,
  (VTBL_ENTRY)&_ZN6S644C52v7Ev,
  (VTBL_ENTRY)&_ZN6S644C52v8Ev,
  (VTBL_ENTRY)&_ZN6S644C52v9Ev,
  (VTBL_ENTRY)&_ZN6S644C53v10Ev,
  (VTBL_ENTRY)&_ZN6S644C53v11Ev,
  (VTBL_ENTRY)&_ZN6S644C53v12Ev,
  (VTBL_ENTRY)&_ZN6S644C53v13Ev,
  (VTBL_ENTRY)&_ZN6S644C53v14Ev,
  (VTBL_ENTRY)&_ZN6S644C43v15Ev,
  (VTBL_ENTRY)&_ZN6S644C43v16Ev,
  (VTBL_ENTRY)&_ZN6S644C43v17Ev,
  (VTBL_ENTRY)&_ZN6S644C43v18Ev,
  (VTBL_ENTRY)&_ZN6S644C43v19Ev,
  (VTBL_ENTRY)&_ZN6S644C33v20Ev,
  (VTBL_ENTRY)&_ZN6S644C33v21Ev,
  (VTBL_ENTRY)&_ZN6S644C33v22Ev,
  (VTBL_ENTRY)&_ZN6S644C33v23Ev,
  (VTBL_ENTRY)&_ZN6S644C23v24Ev,
  (VTBL_ENTRY)&_ZN6S644C23v25Ev,
  (VTBL_ENTRY)&_ZN6S644C23v26Ev,
  (VTBL_ENTRY)&_ZN6S644C23v27Ev,
};
extern VTBL_ENTRY _ZTI6S644C2[];
extern  VTBL_ENTRY _ZTV6S644C2[];
Class_Descriptor cd_S644C2 = {  "S644C2", // class name
  bases_S644C2, 3,
  &(vtc_S644C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI6S644C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S644C2),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S644C1  : S644C2 {
  ::S10103C82_nt s644c1f0;
  ::S10103C82_nt s644c1f1;
  ::S10103C82_nt s644c1f2;
  ::S10103C82_nt s644c1f3;
  ::S10103C82_nt s644c1f4;
  int s644c1f5;
  ::S10103C82_nt s644c1f6;
  ::S10103C82_nt s644c1f7;
  int s644c1f8[2];
  virtual  ~S644C1(); // _ZN6S644C1D1Ev
  virtual void  v1(); // _ZN6S644C12v1Ev
  virtual void  v2(); // _ZN6S644C12v2Ev
  virtual void  v3(); // _ZN6S644C12v3Ev
  virtual void  v4(); // _ZN6S644C12v4Ev
  S644C1(); // tgen
};
//SIG(1 S644C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC6 FC6 FC6 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC9 FC9} v20 v21 v22 v23 Fc} v24 v25 v26 v27 Fc Fi} vd v1 v2 v3 v4 FC12{ m FC13{ m FL[2]}} FC12 FC12 FC12 FC12 Fi FC12 FC12 Fi[2]}


 S644C1 ::~S644C1(){ note_dtor("S644C1", this);}
void  S644C1 ::v1(){vfunc_called(this, "_ZN6S644C12v1Ev");}
void  S644C1 ::v2(){vfunc_called(this, "_ZN6S644C12v2Ev");}
void  S644C1 ::v3(){vfunc_called(this, "_ZN6S644C12v3Ev");}
void  S644C1 ::v4(){vfunc_called(this, "_ZN6S644C12v4Ev");}
S644C1 ::S644C1(){ note_ctor("S644C1", this);} // tgen

static void Test_S644C1()
{
  extern Class_Descriptor cd_S644C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(41,64)];
    init_test(&cd_S644C1, buf);
    S644C1 *dp, &lv = *(dp=new (buf) S644C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(320,252), "sizeof(S644C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S644C1)");
    check_base_class_offset(lv, (S644C5*)(S644C4*)(S644C3*)(S644C2*), 0, "S644C1");
    check_base_class_offset(lv, (S644C4*)(S644C3*)(S644C2*), 0, "S644C1");
    check_base_class_offset(lv, (S644C3*)(S644C2*), 0, "S644C1");
    check_base_class_offset(lv, (S644C2*), 0, "S644C1");
    check_field_offset(lv, s644c1f0, ABISELECT(192,128), "S644C1.s644c1f0");
    check_field_offset(lv, s644c1f1, ABISELECT(208,144), "S644C1.s644c1f1");
    check_field_offset(lv, s644c1f2, ABISELECT(224,160), "S644C1.s644c1f2");
    check_field_offset(lv, s644c1f3, ABISELECT(240,176), "S644C1.s644c1f3");
    check_field_offset(lv, s644c1f4, ABISELECT(256,192), "S644C1.s644c1f4");
    check_field_offset(lv, s644c1f5, ABISELECT(272,208), "S644C1.s644c1f5");
    check_field_offset(lv, s644c1f6, ABISELECT(280,212), "S644C1.s644c1f6");
    check_field_offset(lv, s644c1f7, ABISELECT(296,228), "S644C1.s644c1f7");
    check_field_offset(lv, s644c1f8, ABISELECT(312,244), "S644C1.s644c1f8");
    test_class_info(&lv, &cd_S644C1);
    dp->~S644C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS644C1(Test_S644C1, "S644C1", ABISELECT(320,252));

#else // __cplusplus

extern void _ZN6S644C1C1Ev();
extern void _ZN6S644C1D1Ev();
Name_Map name_map_S644C1[] = {
  NSPAIR(_ZN6S644C1C1Ev),
  NSPAIR(_ZN6S644C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S644C5;
extern VTBL_ENTRY _ZTI6S644C5[];
extern  VTBL_ENTRY _ZTV6S644C5[];
extern Class_Descriptor cd_S644C4;
extern VTBL_ENTRY _ZTI6S644C4[];
extern  VTBL_ENTRY _ZTV6S644C4[];
extern Class_Descriptor cd_S644C3;
extern VTBL_ENTRY _ZTI6S644C3[];
extern  VTBL_ENTRY _ZTV6S644C3[];
extern Class_Descriptor cd_S644C2;
extern VTBL_ENTRY _ZTI6S644C2[];
extern  VTBL_ENTRY _ZTV6S644C2[];
static Base_Class bases_S644C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S644C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S644C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S644C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S644C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S644C1[];
extern void _ZN6S644C1D1Ev();
extern void _ZN6S644C1D0Ev();
extern void _ZN6S644C52v5Ev();
extern void _ZN6S644C52v6Ev();
extern void _ZN6S644C52v7Ev();
extern void _ZN6S644C52v8Ev();
extern void _ZN6S644C52v9Ev();
extern void _ZN6S644C53v10Ev();
extern void _ZN6S644C53v11Ev();
extern void _ZN6S644C53v12Ev();
extern void _ZN6S644C53v13Ev();
extern void _ZN6S644C53v14Ev();
extern void _ZN6S644C43v15Ev();
extern void _ZN6S644C43v16Ev();
extern void _ZN6S644C43v17Ev();
extern void _ZN6S644C43v18Ev();
extern void _ZN6S644C43v19Ev();
extern void _ZN6S644C33v20Ev();
extern void _ZN6S644C33v21Ev();
extern void _ZN6S644C33v22Ev();
extern void _ZN6S644C33v23Ev();
extern void _ZN6S644C23v24Ev();
extern void _ZN6S644C23v25Ev();
extern void _ZN6S644C23v26Ev();
extern void _ZN6S644C23v27Ev();
extern void _ZN6S644C12v1Ev();
extern void _ZN6S644C12v2Ev();
extern void _ZN6S644C12v3Ev();
extern void _ZN6S644C12v4Ev();
static  VTBL_ENTRY vtc_S644C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S644C1[0]),
  (VTBL_ENTRY)&_ZN6S644C1D1Ev,
  (VTBL_ENTRY)&_ZN6S644C1D0Ev,
  (VTBL_ENTRY)&_ZN6S644C52v5Ev,
  (VTBL_ENTRY)&_ZN6S644C52v6Ev,
  (VTBL_ENTRY)&_ZN6S644C52v7Ev,
  (VTBL_ENTRY)&_ZN6S644C52v8Ev,
  (VTBL_ENTRY)&_ZN6S644C52v9Ev,
  (VTBL_ENTRY)&_ZN6S644C53v10Ev,
  (VTBL_ENTRY)&_ZN6S644C53v11Ev,
  (VTBL_ENTRY)&_ZN6S644C53v12Ev,
  (VTBL_ENTRY)&_ZN6S644C53v13Ev,
  (VTBL_ENTRY)&_ZN6S644C53v14Ev,
  (VTBL_ENTRY)&_ZN6S644C43v15Ev,
  (VTBL_ENTRY)&_ZN6S644C43v16Ev,
  (VTBL_ENTRY)&_ZN6S644C43v17Ev,
  (VTBL_ENTRY)&_ZN6S644C43v18Ev,
  (VTBL_ENTRY)&_ZN6S644C43v19Ev,
  (VTBL_ENTRY)&_ZN6S644C33v20Ev,
  (VTBL_ENTRY)&_ZN6S644C33v21Ev,
  (VTBL_ENTRY)&_ZN6S644C33v22Ev,
  (VTBL_ENTRY)&_ZN6S644C33v23Ev,
  (VTBL_ENTRY)&_ZN6S644C23v24Ev,
  (VTBL_ENTRY)&_ZN6S644C23v25Ev,
  (VTBL_ENTRY)&_ZN6S644C23v26Ev,
  (VTBL_ENTRY)&_ZN6S644C23v27Ev,
  (VTBL_ENTRY)&_ZN6S644C12v1Ev,
  (VTBL_ENTRY)&_ZN6S644C12v2Ev,
  (VTBL_ENTRY)&_ZN6S644C12v3Ev,
  (VTBL_ENTRY)&_ZN6S644C12v4Ev,
};
extern VTBL_ENTRY _ZTI6S644C1[];
extern  VTBL_ENTRY _ZTV6S644C1[];
Class_Descriptor cd_S644C1 = {  "S644C1", // class name
  bases_S644C1, 4,
  &(vtc_S644C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(320,252), // object size
  NSPAIRA(_ZTI6S644C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S644C1),31, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1490C4  {
  void *s1490c4f0[2];
  ::S10103C13_nt s1490c4f1;
  void *s1490c4f2;
  virtual  ~S1490C4(); // _ZN7S1490C4D1Ev
  virtual void  v5(); // _ZN7S1490C42v5Ev
  virtual void  v6(); // _ZN7S1490C42v6Ev
  virtual void  v7(); // _ZN7S1490C42v7Ev
  virtual void  v8(); // _ZN7S1490C42v8Ev
  virtual void  v9(); // _ZN7S1490C42v9Ev
  virtual void  v10(); // _ZN7S1490C43v10Ev
  virtual void  v11(); // _ZN7S1490C43v11Ev
  virtual void  v12(); // _ZN7S1490C43v12Ev
  virtual void  v13(); // _ZN7S1490C43v13Ev
  virtual void  v14(); // _ZN7S1490C43v14Ev
  S1490C4(); // tgen
};
//SIG(-1 S1490C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1490C4 ::~S1490C4(){ note_dtor("S1490C4", this);}
void  S1490C4 ::v5(){vfunc_called(this, "_ZN7S1490C42v5Ev");}
void  S1490C4 ::v6(){vfunc_called(this, "_ZN7S1490C42v6Ev");}
void  S1490C4 ::v7(){vfunc_called(this, "_ZN7S1490C42v7Ev");}
void  S1490C4 ::v8(){vfunc_called(this, "_ZN7S1490C42v8Ev");}
void  S1490C4 ::v9(){vfunc_called(this, "_ZN7S1490C42v9Ev");}
void  S1490C4 ::v10(){vfunc_called(this, "_ZN7S1490C43v10Ev");}
void  S1490C4 ::v11(){vfunc_called(this, "_ZN7S1490C43v11Ev");}
void  S1490C4 ::v12(){vfunc_called(this, "_ZN7S1490C43v12Ev");}
void  S1490C4 ::v13(){vfunc_called(this, "_ZN7S1490C43v13Ev");}
void  S1490C4 ::v14(){vfunc_called(this, "_ZN7S1490C43v14Ev");}
S1490C4 ::S1490C4(){ note_ctor("S1490C4", this);} // tgen

static void Test_S1490C4()
{
  extern Class_Descriptor cd_S1490C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1490C4, buf);
    S1490C4 *dp, &lv = *(dp=new (buf) S1490C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1490C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1490C4)");
    check_field_offset(lv, s1490c4f0, ABISELECT(8,4), "S1490C4.s1490c4f0");
    check_field_offset(lv, s1490c4f1, ABISELECT(24,12), "S1490C4.s1490c4f1");
    check_field_offset(lv, s1490c4f2, ABISELECT(48,28), "S1490C4.s1490c4f2");
    test_class_info(&lv, &cd_S1490C4);
    dp->~S1490C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1490C4(Test_S1490C4, "S1490C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1490C4C1Ev();
extern void _ZN7S1490C4D1Ev();
Name_Map name_map_S1490C4[] = {
  NSPAIR(_ZN7S1490C4C1Ev),
  NSPAIR(_ZN7S1490C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1490C4[];
extern void _ZN7S1490C4D1Ev();
extern void _ZN7S1490C4D0Ev();
extern void _ZN7S1490C42v5Ev();
extern void _ZN7S1490C42v6Ev();
extern void _ZN7S1490C42v7Ev();
extern void _ZN7S1490C42v8Ev();
extern void _ZN7S1490C42v9Ev();
extern void _ZN7S1490C43v10Ev();
extern void _ZN7S1490C43v11Ev();
extern void _ZN7S1490C43v12Ev();
extern void _ZN7S1490C43v13Ev();
extern void _ZN7S1490C43v14Ev();
static  VTBL_ENTRY vtc_S1490C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1490C4[0]),
  (VTBL_ENTRY)&_ZN7S1490C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1490C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1490C4[];
extern  VTBL_ENTRY _ZTV7S1490C4[];
Class_Descriptor cd_S1490C4 = {  "S1490C4", // class name
  0,0,//no base classes
  &(vtc_S1490C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1490C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1490C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1490C3  : S1490C4 {
  ::S10103C86 s1490c3f0;
  ::S10103C106 s1490c3f1;
  ::S10103C82_nt s1490c3f2;
  ::S10103C13_nt s1490c3f3;
  virtual  ~S1490C3(); // _ZN7S1490C3D1Ev
  virtual void  v15(); // _ZN7S1490C33v15Ev
  virtual void  v16(); // _ZN7S1490C33v16Ev
  virtual void  v17(); // _ZN7S1490C33v17Ev
  virtual void  v18(); // _ZN7S1490C33v18Ev
  virtual void  v19(); // _ZN7S1490C33v19Ev
  virtual void  v20(); // _ZN7S1490C33v20Ev
  virtual void  v21(); // _ZN7S1490C33v21Ev
  virtual void  v22(); // _ZN7S1490C33v22Ev
  virtual void  v23(); // _ZN7S1490C33v23Ev
  virtual void  v24(); // _ZN7S1490C33v24Ev
  virtual void  v25(); // _ZN7S1490C33v25Ev
  virtual void  v26(); // _ZN7S1490C33v26Ev
  virtual void  v27(); // _ZN7S1490C33v27Ev
  virtual void  v28(); // _ZN7S1490C33v28Ev
  S1490C3(); // tgen
};
//SIG(-1 S1490C3) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S1490C3 ::~S1490C3(){ note_dtor("S1490C3", this);}
void  S1490C3 ::v15(){vfunc_called(this, "_ZN7S1490C33v15Ev");}
void  S1490C3 ::v16(){vfunc_called(this, "_ZN7S1490C33v16Ev");}
void  S1490C3 ::v17(){vfunc_called(this, "_ZN7S1490C33v17Ev");}
void  S1490C3 ::v18(){vfunc_called(this, "_ZN7S1490C33v18Ev");}
void  S1490C3 ::v19(){vfunc_called(this, "_ZN7S1490C33v19Ev");}
void  S1490C3 ::v20(){vfunc_called(this, "_ZN7S1490C33v20Ev");}
void  S1490C3 ::v21(){vfunc_called(this, "_ZN7S1490C33v21Ev");}
void  S1490C3 ::v22(){vfunc_called(this, "_ZN7S1490C33v22Ev");}
void  S1490C3 ::v23(){vfunc_called(this, "_ZN7S1490C33v23Ev");}
void  S1490C3 ::v24(){vfunc_called(this, "_ZN7S1490C33v24Ev");}
void  S1490C3 ::v25(){vfunc_called(this, "_ZN7S1490C33v25Ev");}
void  S1490C3 ::v26(){vfunc_called(this, "_ZN7S1490C33v26Ev");}
void  S1490C3 ::v27(){vfunc_called(this, "_ZN7S1490C33v27Ev");}
void  S1490C3 ::v28(){vfunc_called(this, "_ZN7S1490C33v28Ev");}
S1490C3 ::S1490C3(){ note_ctor("S1490C3", this);} // tgen

static void Test_S1490C3()
{
  extern Class_Descriptor cd_S1490C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S1490C3, buf);
    S1490C3 *dp, &lv = *(dp=new (buf) S1490C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S1490C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1490C3)");
    check_base_class_offset(lv, (S1490C4*), 0, "S1490C3");
    check_field_offset(lv, s1490c3f0, ABISELECT(56,32), "S1490C3.s1490c3f0");
    check_field_offset(lv, s1490c3f1, ABISELECT(72,44), "S1490C3.s1490c3f1");
    check_field_offset(lv, s1490c3f2, ABISELECT(96,60), "S1490C3.s1490c3f2");
    check_field_offset(lv, s1490c3f3, ABISELECT(112,76), "S1490C3.s1490c3f3");
    test_class_info(&lv, &cd_S1490C3);
    dp->~S1490C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1490C3(Test_S1490C3, "S1490C3", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S1490C3C1Ev();
extern void _ZN7S1490C3D1Ev();
Name_Map name_map_S1490C3[] = {
  NSPAIR(_ZN7S1490C3C1Ev),
  NSPAIR(_ZN7S1490C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1490C4;
extern VTBL_ENTRY _ZTI7S1490C4[];
extern  VTBL_ENTRY _ZTV7S1490C4[];
static Base_Class bases_S1490C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1490C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1490C3[];
extern void _ZN7S1490C3D1Ev();
extern void _ZN7S1490C3D0Ev();
extern void _ZN7S1490C42v5Ev();
extern void _ZN7S1490C42v6Ev();
extern void _ZN7S1490C42v7Ev();
extern void _ZN7S1490C42v8Ev();
extern void _ZN7S1490C42v9Ev();
extern void _ZN7S1490C43v10Ev();
extern void _ZN7S1490C43v11Ev();
extern void _ZN7S1490C43v12Ev();
extern void _ZN7S1490C43v13Ev();
extern void _ZN7S1490C43v14Ev();
extern void _ZN7S1490C33v15Ev();
extern void _ZN7S1490C33v16Ev();
extern void _ZN7S1490C33v17Ev();
extern void _ZN7S1490C33v18Ev();
extern void _ZN7S1490C33v19Ev();
extern void _ZN7S1490C33v20Ev();
extern void _ZN7S1490C33v21Ev();
extern void _ZN7S1490C33v22Ev();
extern void _ZN7S1490C33v23Ev();
extern void _ZN7S1490C33v24Ev();
extern void _ZN7S1490C33v25Ev();
extern void _ZN7S1490C33v26Ev();
extern void _ZN7S1490C33v27Ev();
extern void _ZN7S1490C33v28Ev();
static  VTBL_ENTRY vtc_S1490C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1490C3[0]),
  (VTBL_ENTRY)&_ZN7S1490C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1490C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v28Ev,
};
extern VTBL_ENTRY _ZTI7S1490C3[];
extern  VTBL_ENTRY _ZTV7S1490C3[];
Class_Descriptor cd_S1490C3 = {  "S1490C3", // class name
  bases_S1490C3, 1,
  &(vtc_S1490C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S1490C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1490C3),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1490C2  : S1490C3 {
  int s1490c2f0;
  char s1490c2f1[2];
  int s1490c2f2;
  virtual void  v29(); // _ZN7S1490C23v29Ev
  virtual void  v30(); // _ZN7S1490C23v30Ev
  virtual void  v31(); // _ZN7S1490C23v31Ev
  virtual void  v32(); // _ZN7S1490C23v32Ev
  ~S1490C2(); // tgen
  S1490C2(); // tgen
};
//SIG(-1 S1490C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1 v2 v3 v4 Fi Fc[2] Fi}


void  S1490C2 ::v29(){vfunc_called(this, "_ZN7S1490C23v29Ev");}
void  S1490C2 ::v30(){vfunc_called(this, "_ZN7S1490C23v30Ev");}
void  S1490C2 ::v31(){vfunc_called(this, "_ZN7S1490C23v31Ev");}
void  S1490C2 ::v32(){vfunc_called(this, "_ZN7S1490C23v32Ev");}
S1490C2 ::~S1490C2(){ note_dtor("S1490C2", this);} // tgen
S1490C2 ::S1490C2(){ note_ctor("S1490C2", this);} // tgen

static void Test_S1490C2()
{
  extern Class_Descriptor cd_S1490C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,27)];
    init_test(&cd_S1490C2, buf);
    S1490C2 *dp, &lv = *(dp=new (buf) S1490C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S1490C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1490C2)");
    check_base_class_offset(lv, (S1490C4*)(S1490C3*), 0, "S1490C2");
    check_base_class_offset(lv, (S1490C3*), 0, "S1490C2");
    check_field_offset(lv, s1490c2f0, ABISELECT(136,92), "S1490C2.s1490c2f0");
    check_field_offset(lv, s1490c2f1, ABISELECT(140,96), "S1490C2.s1490c2f1");
    check_field_offset(lv, s1490c2f2, ABISELECT(144,100), "S1490C2.s1490c2f2");
    test_class_info(&lv, &cd_S1490C2);
    dp->~S1490C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1490C2(Test_S1490C2, "S1490C2", ABISELECT(152,104));

#else // __cplusplus

extern void _ZN7S1490C2C1Ev();
extern void _ZN7S1490C2D1Ev();
Name_Map name_map_S1490C2[] = {
  NSPAIR(_ZN7S1490C2C1Ev),
  NSPAIR(_ZN7S1490C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1490C4;
extern VTBL_ENTRY _ZTI7S1490C4[];
extern  VTBL_ENTRY _ZTV7S1490C4[];
extern Class_Descriptor cd_S1490C3;
extern VTBL_ENTRY _ZTI7S1490C3[];
extern  VTBL_ENTRY _ZTV7S1490C3[];
static Base_Class bases_S1490C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1490C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1490C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1490C2[];
extern void _ZN7S1490C2D1Ev();
extern void _ZN7S1490C2D0Ev();
extern void _ZN7S1490C42v5Ev();
extern void _ZN7S1490C42v6Ev();
extern void _ZN7S1490C42v7Ev();
extern void _ZN7S1490C42v8Ev();
extern void _ZN7S1490C42v9Ev();
extern void _ZN7S1490C43v10Ev();
extern void _ZN7S1490C43v11Ev();
extern void _ZN7S1490C43v12Ev();
extern void _ZN7S1490C43v13Ev();
extern void _ZN7S1490C43v14Ev();
extern void _ZN7S1490C33v15Ev();
extern void _ZN7S1490C33v16Ev();
extern void _ZN7S1490C33v17Ev();
extern void _ZN7S1490C33v18Ev();
extern void _ZN7S1490C33v19Ev();
extern void _ZN7S1490C33v20Ev();
extern void _ZN7S1490C33v21Ev();
extern void _ZN7S1490C33v22Ev();
extern void _ZN7S1490C33v23Ev();
extern void _ZN7S1490C33v24Ev();
extern void _ZN7S1490C33v25Ev();
extern void _ZN7S1490C33v26Ev();
extern void _ZN7S1490C33v27Ev();
extern void _ZN7S1490C33v28Ev();
extern void _ZN7S1490C23v29Ev();
extern void _ZN7S1490C23v30Ev();
extern void _ZN7S1490C23v31Ev();
extern void _ZN7S1490C23v32Ev();
static  VTBL_ENTRY vtc_S1490C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1490C2[0]),
  (VTBL_ENTRY)&_ZN7S1490C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1490C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v32Ev,
};
extern VTBL_ENTRY _ZTI7S1490C2[];
extern  VTBL_ENTRY _ZTV7S1490C2[];
Class_Descriptor cd_S1490C2 = {  "S1490C2", // class name
  bases_S1490C2, 2,
  &(vtc_S1490C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,104), // object size
  NSPAIRA(_ZTI7S1490C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1490C2),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1490C1  : S1490C2 {
  int s1490c1f0[2];
  virtual  ~S1490C1(); // _ZN7S1490C1D1Ev
  virtual void  v1(); // _ZN7S1490C12v1Ev
  virtual void  v2(); // _ZN7S1490C12v2Ev
  virtual void  v3(); // _ZN7S1490C12v3Ev
  virtual void  v4(); // _ZN7S1490C12v4Ev
  S1490C1(); // tgen
};
//SIG(1 S1490C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC11{ m Fp Fi[2] FC10} FC12{ m FC13{ m FL[2]}} FC5} v29 v30 v31 v32 Fi Fc[2] Fi} vd v1 v2 v3 v4 Fi[2]}


 S1490C1 ::~S1490C1(){ note_dtor("S1490C1", this);}
void  S1490C1 ::v1(){vfunc_called(this, "_ZN7S1490C12v1Ev");}
void  S1490C1 ::v2(){vfunc_called(this, "_ZN7S1490C12v2Ev");}
void  S1490C1 ::v3(){vfunc_called(this, "_ZN7S1490C12v3Ev");}
void  S1490C1 ::v4(){vfunc_called(this, "_ZN7S1490C12v4Ev");}
S1490C1 ::S1490C1(){ note_ctor("S1490C1", this);} // tgen

static void Test_S1490C1()
{
  extern Class_Descriptor cd_S1490C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(21,29)];
    init_test(&cd_S1490C1, buf);
    S1490C1 *dp, &lv = *(dp=new (buf) S1490C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(160,112), "sizeof(S1490C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1490C1)");
    check_base_class_offset(lv, (S1490C4*)(S1490C3*)(S1490C2*), 0, "S1490C1");
    check_base_class_offset(lv, (S1490C3*)(S1490C2*), 0, "S1490C1");
    check_base_class_offset(lv, (S1490C2*), 0, "S1490C1");
    check_field_offset(lv, s1490c1f0, ABISELECT(148,104), "S1490C1.s1490c1f0");
    test_class_info(&lv, &cd_S1490C1);
    dp->~S1490C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1490C1(Test_S1490C1, "S1490C1", ABISELECT(160,112));

#else // __cplusplus

extern void _ZN7S1490C1C1Ev();
extern void _ZN7S1490C1D1Ev();
Name_Map name_map_S1490C1[] = {
  NSPAIR(_ZN7S1490C1C1Ev),
  NSPAIR(_ZN7S1490C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1490C4;
extern VTBL_ENTRY _ZTI7S1490C4[];
extern  VTBL_ENTRY _ZTV7S1490C4[];
extern Class_Descriptor cd_S1490C3;
extern VTBL_ENTRY _ZTI7S1490C3[];
extern  VTBL_ENTRY _ZTV7S1490C3[];
extern Class_Descriptor cd_S1490C2;
extern VTBL_ENTRY _ZTI7S1490C2[];
extern  VTBL_ENTRY _ZTV7S1490C2[];
static Base_Class bases_S1490C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1490C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1490C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1490C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1490C1[];
extern void _ZN7S1490C1D1Ev();
extern void _ZN7S1490C1D0Ev();
extern void _ZN7S1490C42v5Ev();
extern void _ZN7S1490C42v6Ev();
extern void _ZN7S1490C42v7Ev();
extern void _ZN7S1490C42v8Ev();
extern void _ZN7S1490C42v9Ev();
extern void _ZN7S1490C43v10Ev();
extern void _ZN7S1490C43v11Ev();
extern void _ZN7S1490C43v12Ev();
extern void _ZN7S1490C43v13Ev();
extern void _ZN7S1490C43v14Ev();
extern void _ZN7S1490C33v15Ev();
extern void _ZN7S1490C33v16Ev();
extern void _ZN7S1490C33v17Ev();
extern void _ZN7S1490C33v18Ev();
extern void _ZN7S1490C33v19Ev();
extern void _ZN7S1490C33v20Ev();
extern void _ZN7S1490C33v21Ev();
extern void _ZN7S1490C33v22Ev();
extern void _ZN7S1490C33v23Ev();
extern void _ZN7S1490C33v24Ev();
extern void _ZN7S1490C33v25Ev();
extern void _ZN7S1490C33v26Ev();
extern void _ZN7S1490C33v27Ev();
extern void _ZN7S1490C33v28Ev();
extern void _ZN7S1490C23v29Ev();
extern void _ZN7S1490C23v30Ev();
extern void _ZN7S1490C23v31Ev();
extern void _ZN7S1490C23v32Ev();
extern void _ZN7S1490C12v1Ev();
extern void _ZN7S1490C12v2Ev();
extern void _ZN7S1490C12v3Ev();
extern void _ZN7S1490C12v4Ev();
static  VTBL_ENTRY vtc_S1490C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1490C1[0]),
  (VTBL_ENTRY)&_ZN7S1490C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1490C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1490C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1490C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v20Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v21Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v22Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v23Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v24Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v25Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v26Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v27Ev,
  (VTBL_ENTRY)&_ZN7S1490C33v28Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v29Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v30Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v31Ev,
  (VTBL_ENTRY)&_ZN7S1490C23v32Ev,
  (VTBL_ENTRY)&_ZN7S1490C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1490C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1490C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1490C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1490C1[];
extern  VTBL_ENTRY _ZTV7S1490C1[];
Class_Descriptor cd_S1490C1 = {  "S1490C1", // class name
  bases_S1490C1, 3,
  &(vtc_S1490C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(160,112), // object size
  NSPAIRA(_ZTI7S1490C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1490C1),36, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1482C4  {
  void *s1482c4f0[2];
  ::S10103C13_nt s1482c4f1;
  void *s1482c4f2;
  virtual  ~S1482C4(); // _ZN7S1482C4D1Ev
  virtual void  v5(); // _ZN7S1482C42v5Ev
  virtual void  v6(); // _ZN7S1482C42v6Ev
  virtual void  v7(); // _ZN7S1482C42v7Ev
  virtual void  v8(); // _ZN7S1482C42v8Ev
  virtual void  v9(); // _ZN7S1482C42v9Ev
  virtual void  v10(); // _ZN7S1482C43v10Ev
  virtual void  v11(); // _ZN7S1482C43v11Ev
  virtual void  v12(); // _ZN7S1482C43v12Ev
  virtual void  v13(); // _ZN7S1482C43v13Ev
  virtual void  v14(); // _ZN7S1482C43v14Ev
  S1482C4(); // tgen
};
//SIG(-1 S1482C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1482C4 ::~S1482C4(){ note_dtor("S1482C4", this);}
void  S1482C4 ::v5(){vfunc_called(this, "_ZN7S1482C42v5Ev");}
void  S1482C4 ::v6(){vfunc_called(this, "_ZN7S1482C42v6Ev");}
void  S1482C4 ::v7(){vfunc_called(this, "_ZN7S1482C42v7Ev");}
void  S1482C4 ::v8(){vfunc_called(this, "_ZN7S1482C42v8Ev");}
void  S1482C4 ::v9(){vfunc_called(this, "_ZN7S1482C42v9Ev");}
void  S1482C4 ::v10(){vfunc_called(this, "_ZN7S1482C43v10Ev");}
void  S1482C4 ::v11(){vfunc_called(this, "_ZN7S1482C43v11Ev");}
void  S1482C4 ::v12(){vfunc_called(this, "_ZN7S1482C43v12Ev");}
void  S1482C4 ::v13(){vfunc_called(this, "_ZN7S1482C43v13Ev");}
void  S1482C4 ::v14(){vfunc_called(this, "_ZN7S1482C43v14Ev");}
S1482C4 ::S1482C4(){ note_ctor("S1482C4", this);} // tgen

static void Test_S1482C4()
{
  extern Class_Descriptor cd_S1482C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1482C4, buf);
    S1482C4 *dp, &lv = *(dp=new (buf) S1482C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1482C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1482C4)");
    check_field_offset(lv, s1482c4f0, ABISELECT(8,4), "S1482C4.s1482c4f0");
    check_field_offset(lv, s1482c4f1, ABISELECT(24,12), "S1482C4.s1482c4f1");
    check_field_offset(lv, s1482c4f2, ABISELECT(48,28), "S1482C4.s1482c4f2");
    test_class_info(&lv, &cd_S1482C4);
    dp->~S1482C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1482C4(Test_S1482C4, "S1482C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1482C4C1Ev();
extern void _ZN7S1482C4D1Ev();
Name_Map name_map_S1482C4[] = {
  NSPAIR(_ZN7S1482C4C1Ev),
  NSPAIR(_ZN7S1482C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1482C4[];
extern void _ZN7S1482C4D1Ev();
extern void _ZN7S1482C4D0Ev();
extern void _ZN7S1482C42v5Ev();
extern void _ZN7S1482C42v6Ev();
extern void _ZN7S1482C42v7Ev();
extern void _ZN7S1482C42v8Ev();
extern void _ZN7S1482C42v9Ev();
extern void _ZN7S1482C43v10Ev();
extern void _ZN7S1482C43v11Ev();
extern void _ZN7S1482C43v12Ev();
extern void _ZN7S1482C43v13Ev();
extern void _ZN7S1482C43v14Ev();
static  VTBL_ENTRY vtc_S1482C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1482C4[0]),
  (VTBL_ENTRY)&_ZN7S1482C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1482C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1482C4[];
extern  VTBL_ENTRY _ZTV7S1482C4[];
Class_Descriptor cd_S1482C4 = {  "S1482C4", // class name
  0,0,//no base classes
  &(vtc_S1482C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1482C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1482C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1482C3  : S1482C4 {
  void *s1482c3f0;
  ::S10103C13_nt s1482c3f1;
  ::S10103C13_nt s1482c3f2;
  ::S10103C13_nt s1482c3f3;
  ::S10103C86 s1482c3f4;
  ::S10103C86 s1482c3f5;
  ::S10103C86 s1482c3f6;
  virtual  ~S1482C3(); // _ZN7S1482C3D1Ev
  virtual void  v15(); // _ZN7S1482C33v15Ev
  virtual void  v16(); // _ZN7S1482C33v16Ev
  virtual void  v17(); // _ZN7S1482C33v17Ev
  virtual void  v18(); // _ZN7S1482C33v18Ev
  virtual void  v19(); // _ZN7S1482C33v19Ev
  S1482C3(); // tgen
};
//SIG(-1 S1482C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1482C3 ::~S1482C3(){ note_dtor("S1482C3", this);}
void  S1482C3 ::v15(){vfunc_called(this, "_ZN7S1482C33v15Ev");}
void  S1482C3 ::v16(){vfunc_called(this, "_ZN7S1482C33v16Ev");}
void  S1482C3 ::v17(){vfunc_called(this, "_ZN7S1482C33v17Ev");}
void  S1482C3 ::v18(){vfunc_called(this, "_ZN7S1482C33v18Ev");}
void  S1482C3 ::v19(){vfunc_called(this, "_ZN7S1482C33v19Ev");}
S1482C3 ::S1482C3(){ note_ctor("S1482C3", this);} // tgen

static void Test_S1482C3()
{
  extern Class_Descriptor cd_S1482C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1482C3, buf);
    S1482C3 *dp, &lv = *(dp=new (buf) S1482C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1482C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1482C3)");
    check_base_class_offset(lv, (S1482C4*), 0, "S1482C3");
    check_field_offset(lv, s1482c3f0, ABISELECT(56,32), "S1482C3.s1482c3f0");
    check_field_offset(lv, s1482c3f1, ABISELECT(64,36), "S1482C3.s1482c3f1");
    check_field_offset(lv, s1482c3f2, ABISELECT(88,52), "S1482C3.s1482c3f2");
    check_field_offset(lv, s1482c3f3, ABISELECT(112,68), "S1482C3.s1482c3f3");
    check_field_offset(lv, s1482c3f4, ABISELECT(136,84), "S1482C3.s1482c3f4");
    check_field_offset(lv, s1482c3f5, ABISELECT(152,96), "S1482C3.s1482c3f5");
    check_field_offset(lv, s1482c3f6, ABISELECT(168,108), "S1482C3.s1482c3f6");
    test_class_info(&lv, &cd_S1482C3);
    dp->~S1482C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1482C3(Test_S1482C3, "S1482C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1482C3C1Ev();
extern void _ZN7S1482C3D1Ev();
Name_Map name_map_S1482C3[] = {
  NSPAIR(_ZN7S1482C3C1Ev),
  NSPAIR(_ZN7S1482C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1482C4;
extern VTBL_ENTRY _ZTI7S1482C4[];
extern  VTBL_ENTRY _ZTV7S1482C4[];
static Base_Class bases_S1482C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1482C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1482C3[];
extern void _ZN7S1482C3D1Ev();
extern void _ZN7S1482C3D0Ev();
extern void _ZN7S1482C42v5Ev();
extern void _ZN7S1482C42v6Ev();
extern void _ZN7S1482C42v7Ev();
extern void _ZN7S1482C42v8Ev();
extern void _ZN7S1482C42v9Ev();
extern void _ZN7S1482C43v10Ev();
extern void _ZN7S1482C43v11Ev();
extern void _ZN7S1482C43v12Ev();
extern void _ZN7S1482C43v13Ev();
extern void _ZN7S1482C43v14Ev();
extern void _ZN7S1482C33v15Ev();
extern void _ZN7S1482C33v16Ev();
extern void _ZN7S1482C33v17Ev();
extern void _ZN7S1482C33v18Ev();
extern void _ZN7S1482C33v19Ev();
static  VTBL_ENTRY vtc_S1482C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1482C3[0]),
  (VTBL_ENTRY)&_ZN7S1482C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1482C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1482C3[];
extern  VTBL_ENTRY _ZTV7S1482C3[];
Class_Descriptor cd_S1482C3 = {  "S1482C3", // class name
  bases_S1482C3, 1,
  &(vtc_S1482C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1482C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1482C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1482C2  : S1482C3 {
  char s1482c2f0;
  int s1482c2f1[4];
  ::S10103C13_nt s1482c2f2;
  ::S10103C13_nt s1482c2f3;
  char s1482c2f4;
  ::S10103C13_nt s1482c2f5;
  char s1482c2f6;
  virtual  ~S1482C2(); // _ZN7S1482C2D1Ev
  virtual void  v20(); // _ZN7S1482C23v20Ev
  virtual void  v21(); // _ZN7S1482C23v21Ev
  virtual void  v22(); // _ZN7S1482C23v22Ev
  virtual void  v23(); // _ZN7S1482C23v23Ev
  S1482C2(); // tgen
};
//SIG(-1 S1482C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 Fc Fi[4] FC4 FC4 Fc FC4 Fc}


 S1482C2 ::~S1482C2(){ note_dtor("S1482C2", this);}
void  S1482C2 ::v20(){vfunc_called(this, "_ZN7S1482C23v20Ev");}
void  S1482C2 ::v21(){vfunc_called(this, "_ZN7S1482C23v21Ev");}
void  S1482C2 ::v22(){vfunc_called(this, "_ZN7S1482C23v22Ev");}
void  S1482C2 ::v23(){vfunc_called(this, "_ZN7S1482C23v23Ev");}
S1482C2 ::S1482C2(){ note_ctor("S1482C2", this);} // tgen

static void Test_S1482C2()
{
  extern Class_Descriptor cd_S1482C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(38,50)];
    init_test(&cd_S1482C2, buf);
    S1482C2 *dp, &lv = *(dp=new (buf) S1482C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(296,196), "sizeof(S1482C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1482C2)");
    check_base_class_offset(lv, (S1482C4*)(S1482C3*), 0, "S1482C2");
    check_base_class_offset(lv, (S1482C3*), 0, "S1482C2");
    check_field_offset(lv, s1482c2f0, ABISELECT(184,120), "S1482C2.s1482c2f0");
    check_field_offset(lv, s1482c2f1, ABISELECT(188,124), "S1482C2.s1482c2f1");
    check_field_offset(lv, s1482c2f2, ABISELECT(208,140), "S1482C2.s1482c2f2");
    check_field_offset(lv, s1482c2f3, ABISELECT(232,156), "S1482C2.s1482c2f3");
    check_field_offset(lv, s1482c2f4, ABISELECT(256,172), "S1482C2.s1482c2f4");
    check_field_offset(lv, s1482c2f5, ABISELECT(264,176), "S1482C2.s1482c2f5");
    check_field_offset(lv, s1482c2f6, ABISELECT(288,192), "S1482C2.s1482c2f6");
    test_class_info(&lv, &cd_S1482C2);
    dp->~S1482C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1482C2(Test_S1482C2, "S1482C2", ABISELECT(296,196));

#else // __cplusplus

extern void _ZN7S1482C2C1Ev();
extern void _ZN7S1482C2D1Ev();
Name_Map name_map_S1482C2[] = {
  NSPAIR(_ZN7S1482C2C1Ev),
  NSPAIR(_ZN7S1482C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1482C4;
extern VTBL_ENTRY _ZTI7S1482C4[];
extern  VTBL_ENTRY _ZTV7S1482C4[];
extern Class_Descriptor cd_S1482C3;
extern VTBL_ENTRY _ZTI7S1482C3[];
extern  VTBL_ENTRY _ZTV7S1482C3[];
static Base_Class bases_S1482C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1482C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1482C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1482C2[];
extern void _ZN7S1482C2D1Ev();
extern void _ZN7S1482C2D0Ev();
extern void _ZN7S1482C42v5Ev();
extern void _ZN7S1482C42v6Ev();
extern void _ZN7S1482C42v7Ev();
extern void _ZN7S1482C42v8Ev();
extern void _ZN7S1482C42v9Ev();
extern void _ZN7S1482C43v10Ev();
extern void _ZN7S1482C43v11Ev();
extern void _ZN7S1482C43v12Ev();
extern void _ZN7S1482C43v13Ev();
extern void _ZN7S1482C43v14Ev();
extern void _ZN7S1482C33v15Ev();
extern void _ZN7S1482C33v16Ev();
extern void _ZN7S1482C33v17Ev();
extern void _ZN7S1482C33v18Ev();
extern void _ZN7S1482C33v19Ev();
extern void _ZN7S1482C23v20Ev();
extern void _ZN7S1482C23v21Ev();
extern void _ZN7S1482C23v22Ev();
extern void _ZN7S1482C23v23Ev();
static  VTBL_ENTRY vtc_S1482C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1482C2[0]),
  (VTBL_ENTRY)&_ZN7S1482C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1482C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1482C2[];
extern  VTBL_ENTRY _ZTV7S1482C2[];
Class_Descriptor cd_S1482C2 = {  "S1482C2", // class name
  bases_S1482C2, 2,
  &(vtc_S1482C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(296,196), // object size
  NSPAIRA(_ZTI7S1482C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1482C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1482C11_nt  {
  int s1482c11f0;
  char s1482c11f1;
  int s1482c11f2[3];
  void *s1482c11f3;
  void  mf1482c11(); // _ZN11S1482C11_nt9mf1482c11Ev
  virtual  ~S1482C11_nt(); // _ZN11S1482C11_ntD1Ev
  S1482C11_nt(); // tgen
};
//SIG(-1 S1482C11_nt) C1{ vd m Fi Fc Fi[3] Fp}


void  S1482C11_nt ::mf1482c11(){}
 S1482C11_nt ::~S1482C11_nt(){ note_dtor("S1482C11_nt", this);}
S1482C11_nt ::S1482C11_nt(){ note_ctor("S1482C11_nt", this);} // tgen

//skip512 S1482C11_nt

#else // __cplusplus

extern void _ZN11S1482C11_ntC1Ev();
extern void _ZN11S1482C11_ntD1Ev();
Name_Map name_map_S1482C11_nt[] = {
  NSPAIR(_ZN11S1482C11_ntC1Ev),
  NSPAIR(_ZN11S1482C11_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S1482C11_nt[];
extern void _ZN11S1482C11_ntD1Ev();
extern void _ZN11S1482C11_ntD0Ev();
static  VTBL_ENTRY vtc_S1482C11_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S1482C11_nt[0]),
  (VTBL_ENTRY)&_ZN11S1482C11_ntD1Ev,
  (VTBL_ENTRY)&_ZN11S1482C11_ntD0Ev,
};
extern VTBL_ENTRY _ZTI11S1482C11_nt[];
VTBL_ENTRY *P__ZTI11S1482C11_nt = _ZTI11S1482C11_nt; 
extern  VTBL_ENTRY _ZTV11S1482C11_nt[];
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1482C1  : S1482C2 {
  int s1482c1f0;
  char s1482c1f1[4];
  ::S1482C11_nt s1482c1f2;
  ::S10103C13_nt s1482c1f3;
  ::S10103C13_nt s1482c1f4;
  virtual  ~S1482C1(); // _ZN7S1482C1D1Ev
  virtual void  v1(); // _ZN7S1482C12v1Ev
  virtual void  v2(); // _ZN7S1482C12v2Ev
  virtual void  v3(); // _ZN7S1482C12v3Ev
  virtual void  v4(); // _ZN7S1482C12v4Ev
  S1482C1(); // tgen
};
//SIG(1 S1482C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} vd v20 v21 v22 v23 Fc Fi[4] FC5 FC5 Fc FC5 Fc} vd v1 v2 v3 v4 Fi Fc[4] FC11{ vd m Fi Fc Fi[3] Fp} FC5 FC5}


 S1482C1 ::~S1482C1(){ note_dtor("S1482C1", this);}
void  S1482C1 ::v1(){vfunc_called(this, "_ZN7S1482C12v1Ev");}
void  S1482C1 ::v2(){vfunc_called(this, "_ZN7S1482C12v2Ev");}
void  S1482C1 ::v3(){vfunc_called(this, "_ZN7S1482C12v3Ev");}
void  S1482C1 ::v4(){vfunc_called(this, "_ZN7S1482C12v4Ev");}
S1482C1 ::S1482C1(){ note_ctor("S1482C1", this);} // tgen

static void Test_S1482C1()
{
  extern Class_Descriptor cd_S1482C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(50,67)];
    init_test(&cd_S1482C1, buf);
    S1482C1 *dp, &lv = *(dp=new (buf) S1482C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(392,264), "sizeof(S1482C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1482C1)");
    check_base_class_offset(lv, (S1482C4*)(S1482C3*)(S1482C2*), 0, "S1482C1");
    check_base_class_offset(lv, (S1482C3*)(S1482C2*), 0, "S1482C1");
    check_base_class_offset(lv, (S1482C2*), 0, "S1482C1");
    check_field_offset(lv, s1482c1f0, ABISELECT(292,196), "S1482C1.s1482c1f0");
    check_field_offset(lv, s1482c1f1, ABISELECT(296,200), "S1482C1.s1482c1f1");
    check_field_offset(lv, s1482c1f2, ABISELECT(304,204), "S1482C1.s1482c1f2");
    check_field_offset(lv, s1482c1f3, ABISELECT(344,232), "S1482C1.s1482c1f3");
    check_field_offset(lv, s1482c1f4, ABISELECT(368,248), "S1482C1.s1482c1f4");
    test_class_info(&lv, &cd_S1482C1);
    dp->~S1482C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1482C1(Test_S1482C1, "S1482C1", ABISELECT(392,264));

#else // __cplusplus

extern void _ZN7S1482C1C1Ev();
extern void _ZN7S1482C1D1Ev();
Name_Map name_map_S1482C1[] = {
  NSPAIR(_ZN7S1482C1C1Ev),
  NSPAIR(_ZN7S1482C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1482C4;
extern VTBL_ENTRY _ZTI7S1482C4[];
extern  VTBL_ENTRY _ZTV7S1482C4[];
extern Class_Descriptor cd_S1482C3;
extern VTBL_ENTRY _ZTI7S1482C3[];
extern  VTBL_ENTRY _ZTV7S1482C3[];
extern Class_Descriptor cd_S1482C2;
extern VTBL_ENTRY _ZTI7S1482C2[];
extern  VTBL_ENTRY _ZTV7S1482C2[];
static Base_Class bases_S1482C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1482C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1482C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1482C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1482C1[];
extern void _ZN7S1482C1D1Ev();
extern void _ZN7S1482C1D0Ev();
extern void _ZN7S1482C42v5Ev();
extern void _ZN7S1482C42v6Ev();
extern void _ZN7S1482C42v7Ev();
extern void _ZN7S1482C42v8Ev();
extern void _ZN7S1482C42v9Ev();
extern void _ZN7S1482C43v10Ev();
extern void _ZN7S1482C43v11Ev();
extern void _ZN7S1482C43v12Ev();
extern void _ZN7S1482C43v13Ev();
extern void _ZN7S1482C43v14Ev();
extern void _ZN7S1482C33v15Ev();
extern void _ZN7S1482C33v16Ev();
extern void _ZN7S1482C33v17Ev();
extern void _ZN7S1482C33v18Ev();
extern void _ZN7S1482C33v19Ev();
extern void _ZN7S1482C23v20Ev();
extern void _ZN7S1482C23v21Ev();
extern void _ZN7S1482C23v22Ev();
extern void _ZN7S1482C23v23Ev();
extern void _ZN7S1482C12v1Ev();
extern void _ZN7S1482C12v2Ev();
extern void _ZN7S1482C12v3Ev();
extern void _ZN7S1482C12v4Ev();
static  VTBL_ENTRY vtc_S1482C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1482C1[0]),
  (VTBL_ENTRY)&_ZN7S1482C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1482C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1482C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1482C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1482C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1482C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1482C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1482C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1482C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1482C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1482C1[];
extern  VTBL_ENTRY _ZTV7S1482C1[];
Class_Descriptor cd_S1482C1 = {  "S1482C1", // class name
  bases_S1482C1, 3,
  &(vtc_S1482C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(392,264), // object size
  NSPAIRA(_ZTI7S1482C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1482C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C3_nt  {
  int s2718c3f0;
  void  mf2718c3(); // _ZN10S2718C3_nt8mf2718c3Ev
};
//SIG(-1 S2718C3_nt) C1{ m Fi}


void  S2718C3_nt ::mf2718c3(){}

//skip512 S2718C3_nt

#else // __cplusplus

Class_Descriptor cd_S2718C3_nt = {  "S2718C3_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  4, // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C2_nt  : S2718C3_nt {
};
//SIG(-1 S2718C2_nt) C1{ BC2{ m Fi}}



//skip512 S2718C2_nt

#else // __cplusplus

extern Class_Descriptor cd_S2718C3_nt;
static Base_Class bases_S2718C2_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2718C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2718C2_nt = {  "S2718C2_nt", // class name
  bases_S2718C2_nt, 1,
  0, // no vftv
  0, //no vtt
  4, // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C4_nt  {
  char s2718c4f0[3];
  void  mf2718c4(); // _ZN10S2718C4_nt8mf2718c4Ev
};
//SIG(-1 S2718C4_nt) C1{ m Fc[3]}


void  S2718C4_nt ::mf2718c4(){}

//skip512 S2718C4_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C10_nt  {
  ::S10103C64 s2718c10f0;
  void  mf2718c10(); // _ZN11S2718C10_nt9mf2718c10Ev
};
//SIG(-1 S2718C10_nt) C1{ m FC2{ m Fp}}


void  S2718C10_nt ::mf2718c10(){}

//skip512 S2718C10_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C9_nt  {
  ::S2718C10_nt s2718c9f0;
  void  mf2718c9(); // _ZN10S2718C9_nt8mf2718c9Ev
};
//SIG(-1 S2718C9_nt) C1{ m FC2{ m FC3{ m Fp}}}


void  S2718C9_nt ::mf2718c9(){}

//skip512 S2718C9_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C12_nt  : S10103C54_nt {
};
//SIG(-1 S2718C12_nt) C1{ BC2{ m Fp}}



//skip512 S2718C12_nt

#else // __cplusplus

extern Class_Descriptor cd_S10103C54_nt;
static Base_Class bases_S2718C12_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C54_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C8  {
  ::S2718C9_nt s2718c8f0;
  ::S2718C12_nt s2718c8f1;
  void  mf2718c8(); // _ZN7S2718C88mf2718c8Ev
};
//SIG(-1 S2718C8) C1{ m FC2{ m FC3{ m FC4{ m Fp}}} FC5{ BC6{ m Fp}}}


void  S2718C8 ::mf2718c8(){}

static void Test_S2718C8()
{
  {
    init_simple_test("S2718C8");
    S2718C8 lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S2718C8)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2718C8)");
    check_field_offset(lv, s2718c8f0, 0, "S2718C8.s2718c8f0");
    check_field_offset(lv, s2718c8f1, ABISELECT(8,4), "S2718C8.s2718c8f1");
  }
}
static Arrange_To_Call_Me vS2718C8(Test_S2718C8, "S2718C8", ABISELECT(16,8));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C14_nt  {
  void *s2718c14f0;
  void  mf2718c14(); // _ZN11S2718C14_nt9mf2718c14Ev
};
//SIG(-1 S2718C14_nt) C1{ m Fp}


void  S2718C14_nt ::mf2718c14(){}

//skip512 S2718C14_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C7  {
  ::S2718C8 s2718c7f0;
  ::S2718C14_nt s2718c7f1;
  int s2718c7f2[2];
  unsigned int s2718c7f3:1;
  unsigned int s2718c7f4:1;
  int s2718c7f5:2;
  unsigned int s2718c7f6:1;
  unsigned int s2718c7f7:1;
  unsigned int s2718c7f8:1;
  int s2718c7f9:8;
  int s2718c7f10:3;
  unsigned int s2718c7f11:1;
  unsigned int s2718c7f12:1;
  int s2718c7f13:2;
  int s2718c7f14:2;
  int s2718c7f15:2;
  int s2718c7f16:2;
  int s2718c7f17:4;
  int s2718c7f18:2;
  int s2718c7f19:2;
  unsigned int s2718c7f20:1;
  int s2718c7f21;
  void  mf2718c7(); // _ZN7S2718C78mf2718c7Ev
};
//SIG(-1 S2718C7) C1{ m FC2{ m FC3{ m FC4{ m FC5{ m Fp}}} FC6{ BC7{ m Fp}}} FC8{ m Fp} Fi[2] Fi:1 Fi:1 Fi:2 Fi:1 Fi:1 Fi:1 Fi:8 Fi:3 Fi:1 Fi:1 Fi:2 Fi:2 Fi:2 Fi:2 Fi:4 Fi:2 Fi:2 Fi:1 Fi}


void  S2718C7 ::mf2718c7(){}

static void Test_S2718C7()
{
  {
    init_simple_test("S2718C7");
    static S2718C7 lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(S2718C7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2718C7)");
    check_field_offset(lv, s2718c7f0, 0, "S2718C7.s2718c7f0");
    check_field_offset(lv, s2718c7f1, ABISELECT(16,8), "S2718C7.s2718c7f1");
    check_field_offset(lv, s2718c7f2, ABISELECT(24,12), "S2718C7.s2718c7f2");
    set_bf_and_test(lv, s2718c7f3, ABISELECT(32,20), 0, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f4, ABISELECT(32,20), 1, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f5, ABISELECT(32,20), 2, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f5, ABISELECT(32,20), 2, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f6, ABISELECT(32,20), 4, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f7, ABISELECT(32,20), 5, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f8, ABISELECT(32,20), 6, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f9, ABISELECT(32,20), 7, 8, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f9, ABISELECT(32,20), 7, 8, hide_sll(1LL<<7), "S2718C7");
    set_bf_and_test(lv, s2718c7f10, ABISELECT(33,21), 7, 3, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f10, ABISELECT(33,21), 7, 3, hide_sll(1LL<<2), "S2718C7");
    set_bf_and_test(lv, s2718c7f11, ABISELECT(34,22), 2, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f12, ABISELECT(34,22), 3, 1, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f13, ABISELECT(34,22), 4, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f13, ABISELECT(34,22), 4, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f14, ABISELECT(34,22), 6, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f14, ABISELECT(34,22), 6, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f15, ABISELECT(35,23), 0, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f15, ABISELECT(35,23), 0, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f16, ABISELECT(35,23), 2, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f16, ABISELECT(35,23), 2, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f17, ABISELECT(35,23), 4, 4, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f17, ABISELECT(35,23), 4, 4, hide_sll(1LL<<3), "S2718C7");
    set_bf_and_test(lv, s2718c7f18, ABISELECT(36,24), 0, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f18, ABISELECT(36,24), 0, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f19, ABISELECT(36,24), 2, 2, 1, "S2718C7");
    set_bf_and_test(lv, s2718c7f19, ABISELECT(36,24), 2, 2, hide_sll(1LL<<1), "S2718C7");
    set_bf_and_test(lv, s2718c7f20, ABISELECT(36,24), 4, 1, 1, "S2718C7");
    check_field_offset(lv, s2718c7f21, ABISELECT(40,28), "S2718C7.s2718c7f21");
  }
}
static Arrange_To_Call_Me vS2718C7(Test_S2718C7, "S2718C7", ABISELECT(48,32));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C6  {
  ::S2718C7 s2718c6f0;
  ::S2718C14_nt s2718c6f1;
  short s2718c6f2[2];
  char s2718c6f3[2];
  void  mf2718c6(); // _ZN7S2718C68mf2718c6Ev
};
//SIG(-1 S2718C6) C1{ m FC2{ m FC3{ m FC4{ m FC5{ m FC6{ m Fp}}} FC7{ BC8{ m Fp}}} FC9{ m Fp} Fi[2] Fi:1 Fi:1 Fi:2 Fi:1 Fi:1 Fi:1 Fi:8 Fi:3 Fi:1 Fi:1 Fi:2 Fi:2 Fi:2 Fi:2 Fi:4 Fi:2 Fi:2 Fi:1 Fi} FC9 Fs[2] Fc[2]}


void  S2718C6 ::mf2718c6(){}

static void Test_S2718C6()
{
  {
    init_simple_test("S2718C6");
    static S2718C6 lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(S2718C6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2718C6)");
    check_field_offset(lv, s2718c6f0, 0, "S2718C6.s2718c6f0");
    check_field_offset(lv, s2718c6f1, ABISELECT(48,32), "S2718C6.s2718c6f1");
    check_field_offset(lv, s2718c6f2, ABISELECT(56,36), "S2718C6.s2718c6f2");
    check_field_offset(lv, s2718c6f3, ABISELECT(60,40), "S2718C6.s2718c6f3");
  }
}
static Arrange_To_Call_Me vS2718C6(Test_S2718C6, "S2718C6", ABISELECT(64,44));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C16_nt  {
  int s2718c16f0;
  char s2718c16f1;
  void  mf2718c16(); // _ZN11S2718C16_nt9mf2718c16Ev
};
//SIG(-1 S2718C16_nt) C1{ m Fi Fc}


void  S2718C16_nt ::mf2718c16(){}

//skip512 S2718C16_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2718C1  : S2718C2_nt {
  short s2718c1f0[2];
  ::S2718C4_nt s2718c1f1;
  ::S10103C105 s2718c1f2;
  ::S2718C6 s2718c1f3;
  ::S2718C16_nt s2718c1f4;
  ::S2718C16_nt s2718c1f5;
};
//SIG(1 S2718C1) C1{ BC2{ BC3{ m Fi}} Fs[2] FC4{ m Fc[3]} FC5{ m Fp} FC6{ m FC7{ m FC8{ m FC9{ m FC10{ m FC11{ m Fp}}} FC12{ BC13{ m Fp}}} FC14{ m Fp} Fi[2] Fi:1 Fi:1 Fi:2 Fi:1 Fi:1 Fi:1 Fi:8 Fi:3 Fi:1 Fi:1 Fi:2 Fi:2 Fi:2 Fi:2 Fi:4 Fi:2 Fi:2 Fi:1 Fi} FC14 Fs[2] Fc[2]} FC15{ m Fi Fc} FC15}



static void Test_S2718C1()
{
  extern Class_Descriptor cd_S2718C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(14,20)];
    init_test(&cd_S2718C1, buf);
    S2718C1 &lv = *(new (buf) S2718C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(104,76), "sizeof(S2718C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2718C1)");
    check_base_class_offset(lv, (S2718C3_nt*)(S2718C2_nt*), 0, "S2718C1");
    check_base_class_offset(lv, (S2718C2_nt*), 0, "S2718C1");
    check_field_offset(lv, s2718c1f0, 4, "S2718C1.s2718c1f0");
    check_field_offset(lv, s2718c1f1, 8, "S2718C1.s2718c1f1");
    check_field_offset(lv, s2718c1f2, ABISELECT(16,12), "S2718C1.s2718c1f2");
    check_field_offset(lv, s2718c1f3, ABISELECT(24,16), "S2718C1.s2718c1f3");
    check_field_offset(lv, s2718c1f4, ABISELECT(88,60), "S2718C1.s2718c1f4");
    check_field_offset(lv, s2718c1f5, ABISELECT(96,68), "S2718C1.s2718c1f5");
    test_class_info(&lv, &cd_S2718C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2718C1(Test_S2718C1, "S2718C1", ABISELECT(104,76));

#else // __cplusplus

extern Class_Descriptor cd_S2718C3_nt;
extern Class_Descriptor cd_S2718C2_nt;
static Base_Class bases_S2718C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2718C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2718C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2718C1 = {  "S2718C1", // class name
  bases_S2718C1, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(104,76), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S645C5  {
  void *s645c5f0[2];
  ::S10103C13_nt s645c5f1;
  void *s645c5f2;
  virtual  ~S645C5(); // _ZN6S645C5D1Ev
  virtual void  v5(); // _ZN6S645C52v5Ev
  virtual void  v6(); // _ZN6S645C52v6Ev
  virtual void  v7(); // _ZN6S645C52v7Ev
  virtual void  v8(); // _ZN6S645C52v8Ev
  virtual void  v9(); // _ZN6S645C52v9Ev
  virtual void  v10(); // _ZN6S645C53v10Ev
  virtual void  v11(); // _ZN6S645C53v11Ev
  virtual void  v12(); // _ZN6S645C53v12Ev
  virtual void  v13(); // _ZN6S645C53v13Ev
  virtual void  v14(); // _ZN6S645C53v14Ev
  S645C5(); // tgen
};
//SIG(-1 S645C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S645C5 ::~S645C5(){ note_dtor("S645C5", this);}
void  S645C5 ::v5(){vfunc_called(this, "_ZN6S645C52v5Ev");}
void  S645C5 ::v6(){vfunc_called(this, "_ZN6S645C52v6Ev");}
void  S645C5 ::v7(){vfunc_called(this, "_ZN6S645C52v7Ev");}
void  S645C5 ::v8(){vfunc_called(this, "_ZN6S645C52v8Ev");}
void  S645C5 ::v9(){vfunc_called(this, "_ZN6S645C52v9Ev");}
void  S645C5 ::v10(){vfunc_called(this, "_ZN6S645C53v10Ev");}
void  S645C5 ::v11(){vfunc_called(this, "_ZN6S645C53v11Ev");}
void  S645C5 ::v12(){vfunc_called(this, "_ZN6S645C53v12Ev");}
void  S645C5 ::v13(){vfunc_called(this, "_ZN6S645C53v13Ev");}
void  S645C5 ::v14(){vfunc_called(this, "_ZN6S645C53v14Ev");}
S645C5 ::S645C5(){ note_ctor("S645C5", this);} // tgen

static void Test_S645C5()
{
  extern Class_Descriptor cd_S645C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S645C5, buf);
    S645C5 *dp, &lv = *(dp=new (buf) S645C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S645C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S645C5)");
    check_field_offset(lv, s645c5f0, ABISELECT(8,4), "S645C5.s645c5f0");
    check_field_offset(lv, s645c5f1, ABISELECT(24,12), "S645C5.s645c5f1");
    check_field_offset(lv, s645c5f2, ABISELECT(48,28), "S645C5.s645c5f2");
    test_class_info(&lv, &cd_S645C5);
    dp->~S645C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS645C5(Test_S645C5, "S645C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S645C5C1Ev();
extern void _ZN6S645C5D1Ev();
Name_Map name_map_S645C5[] = {
  NSPAIR(_ZN6S645C5C1Ev),
  NSPAIR(_ZN6S645C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S645C5[];
extern void _ZN6S645C5D1Ev();
extern void _ZN6S645C5D0Ev();
extern void _ZN6S645C52v5Ev();
extern void _ZN6S645C52v6Ev();
extern void _ZN6S645C52v7Ev();
extern void _ZN6S645C52v8Ev();
extern void _ZN6S645C52v9Ev();
extern void _ZN6S645C53v10Ev();
extern void _ZN6S645C53v11Ev();
extern void _ZN6S645C53v12Ev();
extern void _ZN6S645C53v13Ev();
extern void _ZN6S645C53v14Ev();
static  VTBL_ENTRY vtc_S645C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S645C5[0]),
  (VTBL_ENTRY)&_ZN6S645C5D1Ev,
  (VTBL_ENTRY)&_ZN6S645C5D0Ev,
  (VTBL_ENTRY)&_ZN6S645C52v5Ev,
  (VTBL_ENTRY)&_ZN6S645C52v6Ev,
  (VTBL_ENTRY)&_ZN6S645C52v7Ev,
  (VTBL_ENTRY)&_ZN6S645C52v8Ev,
  (VTBL_ENTRY)&_ZN6S645C52v9Ev,
  (VTBL_ENTRY)&_ZN6S645C53v10Ev,
  (VTBL_ENTRY)&_ZN6S645C53v11Ev,
  (VTBL_ENTRY)&_ZN6S645C53v12Ev,
  (VTBL_ENTRY)&_ZN6S645C53v13Ev,
  (VTBL_ENTRY)&_ZN6S645C53v14Ev,
};
extern VTBL_ENTRY _ZTI6S645C5[];
extern  VTBL_ENTRY _ZTV6S645C5[];
Class_Descriptor cd_S645C5 = {  "S645C5", // class name
  0,0,//no base classes
  &(vtc_S645C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S645C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S645C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S645C4  : S645C5 {
  void *s645c4f0;
  ::S10103C13_nt s645c4f1;
  ::S10103C13_nt s645c4f2;
  ::S10103C13_nt s645c4f3;
  ::S10103C86 s645c4f4;
  ::S10103C86 s645c4f5;
  ::S10103C86 s645c4f6;
  virtual  ~S645C4(); // _ZN6S645C4D1Ev
  virtual void  v15(); // _ZN6S645C43v15Ev
  virtual void  v16(); // _ZN6S645C43v16Ev
  virtual void  v17(); // _ZN6S645C43v17Ev
  virtual void  v18(); // _ZN6S645C43v18Ev
  virtual void  v19(); // _ZN6S645C43v19Ev
  S645C4(); // tgen
};
//SIG(-1 S645C4) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S645C4 ::~S645C4(){ note_dtor("S645C4", this);}
void  S645C4 ::v15(){vfunc_called(this, "_ZN6S645C43v15Ev");}
void  S645C4 ::v16(){vfunc_called(this, "_ZN6S645C43v16Ev");}
void  S645C4 ::v17(){vfunc_called(this, "_ZN6S645C43v17Ev");}
void  S645C4 ::v18(){vfunc_called(this, "_ZN6S645C43v18Ev");}
void  S645C4 ::v19(){vfunc_called(this, "_ZN6S645C43v19Ev");}
S645C4 ::S645C4(){ note_ctor("S645C4", this);} // tgen

static void Test_S645C4()
{
  extern Class_Descriptor cd_S645C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S645C4, buf);
    S645C4 *dp, &lv = *(dp=new (buf) S645C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S645C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S645C4)");
    check_base_class_offset(lv, (S645C5*), 0, "S645C4");
    check_field_offset(lv, s645c4f0, ABISELECT(56,32), "S645C4.s645c4f0");
    check_field_offset(lv, s645c4f1, ABISELECT(64,36), "S645C4.s645c4f1");
    check_field_offset(lv, s645c4f2, ABISELECT(88,52), "S645C4.s645c4f2");
    check_field_offset(lv, s645c4f3, ABISELECT(112,68), "S645C4.s645c4f3");
    check_field_offset(lv, s645c4f4, ABISELECT(136,84), "S645C4.s645c4f4");
    check_field_offset(lv, s645c4f5, ABISELECT(152,96), "S645C4.s645c4f5");
    check_field_offset(lv, s645c4f6, ABISELECT(168,108), "S645C4.s645c4f6");
    test_class_info(&lv, &cd_S645C4);
    dp->~S645C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS645C4(Test_S645C4, "S645C4", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN6S645C4C1Ev();
extern void _ZN6S645C4D1Ev();
Name_Map name_map_S645C4[] = {
  NSPAIR(_ZN6S645C4C1Ev),
  NSPAIR(_ZN6S645C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S645C5;
extern VTBL_ENTRY _ZTI6S645C5[];
extern  VTBL_ENTRY _ZTV6S645C5[];
static Base_Class bases_S645C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S645C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S645C4[];
extern void _ZN6S645C4D1Ev();
extern void _ZN6S645C4D0Ev();
extern void _ZN6S645C52v5Ev();
extern void _ZN6S645C52v6Ev();
extern void _ZN6S645C52v7Ev();
extern void _ZN6S645C52v8Ev();
extern void _ZN6S645C52v9Ev();
extern void _ZN6S645C53v10Ev();
extern void _ZN6S645C53v11Ev();
extern void _ZN6S645C53v12Ev();
extern void _ZN6S645C53v13Ev();
extern void _ZN6S645C53v14Ev();
extern void _ZN6S645C43v15Ev();
extern void _ZN6S645C43v16Ev();
extern void _ZN6S645C43v17Ev();
extern void _ZN6S645C43v18Ev();
extern void _ZN6S645C43v19Ev();
static  VTBL_ENTRY vtc_S645C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S645C4[0]),
  (VTBL_ENTRY)&_ZN6S645C4D1Ev,
  (VTBL_ENTRY)&_ZN6S645C4D0Ev,
  (VTBL_ENTRY)&_ZN6S645C52v5Ev,
  (VTBL_ENTRY)&_ZN6S645C52v6Ev,
  (VTBL_ENTRY)&_ZN6S645C52v7Ev,
  (VTBL_ENTRY)&_ZN6S645C52v8Ev,
  (VTBL_ENTRY)&_ZN6S645C52v9Ev,
  (VTBL_ENTRY)&_ZN6S645C53v10Ev,
  (VTBL_ENTRY)&_ZN6S645C53v11Ev,
  (VTBL_ENTRY)&_ZN6S645C53v12Ev,
  (VTBL_ENTRY)&_ZN6S645C53v13Ev,
  (VTBL_ENTRY)&_ZN6S645C53v14Ev,
  (VTBL_ENTRY)&_ZN6S645C43v15Ev,
  (VTBL_ENTRY)&_ZN6S645C43v16Ev,
  (VTBL_ENTRY)&_ZN6S645C43v17Ev,
  (VTBL_ENTRY)&_ZN6S645C43v18Ev,
  (VTBL_ENTRY)&_ZN6S645C43v19Ev,
};
extern VTBL_ENTRY _ZTI6S645C4[];
extern  VTBL_ENTRY _ZTV6S645C4[];
Class_Descriptor cd_S645C4 = {  "S645C4", // class name
  bases_S645C4, 1,
  &(vtc_S645C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI6S645C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S645C4),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S645C3  : S645C4 {
  char s645c3f0;
  virtual void  v20(); // _ZN6S645C33v20Ev
  virtual void  v21(); // _ZN6S645C33v21Ev
  virtual void  v22(); // _ZN6S645C33v22Ev
  virtual void  v23(); // _ZN6S645C33v23Ev
  ~S645C3(); // tgen
  S645C3(); // tgen
};
//SIG(-1 S645C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S645C3 ::v20(){vfunc_called(this, "_ZN6S645C33v20Ev");}
void  S645C3 ::v21(){vfunc_called(this, "_ZN6S645C33v21Ev");}
void  S645C3 ::v22(){vfunc_called(this, "_ZN6S645C33v22Ev");}
void  S645C3 ::v23(){vfunc_called(this, "_ZN6S645C33v23Ev");}
S645C3 ::~S645C3(){ note_dtor("S645C3", this);} // tgen
S645C3 ::S645C3(){ note_ctor("S645C3", this);} // tgen

static void Test_S645C3()
{
  extern Class_Descriptor cd_S645C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S645C3, buf);
    S645C3 *dp, &lv = *(dp=new (buf) S645C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S645C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S645C3)");
    check_base_class_offset(lv, (S645C5*)(S645C4*), 0, "S645C3");
    check_base_class_offset(lv, (S645C4*), 0, "S645C3");
    check_field_offset(lv, s645c3f0, ABISELECT(184,120), "S645C3.s645c3f0");
    test_class_info(&lv, &cd_S645C3);
    dp->~S645C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS645C3(Test_S645C3, "S645C3", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN6S645C3C1Ev();
extern void _ZN6S645C3D1Ev();
Name_Map name_map_S645C3[] = {
  NSPAIR(_ZN6S645C3C1Ev),
  NSPAIR(_ZN6S645C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S645C5;
extern VTBL_ENTRY _ZTI6S645C5[];
extern  VTBL_ENTRY _ZTV6S645C5[];
extern Class_Descriptor cd_S645C4;
extern VTBL_ENTRY _ZTI6S645C4[];
extern  VTBL_ENTRY _ZTV6S645C4[];
static Base_Class bases_S645C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S645C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S645C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S645C3[];
extern void _ZN6S645C3D1Ev();
extern void _ZN6S645C3D0Ev();
extern void _ZN6S645C52v5Ev();
extern void _ZN6S645C52v6Ev();
extern void _ZN6S645C52v7Ev();
extern void _ZN6S645C52v8Ev();
extern void _ZN6S645C52v9Ev();
extern void _ZN6S645C53v10Ev();
extern void _ZN6S645C53v11Ev();
extern void _ZN6S645C53v12Ev();
extern void _ZN6S645C53v13Ev();
extern void _ZN6S645C53v14Ev();
extern void _ZN6S645C43v15Ev();
extern void _ZN6S645C43v16Ev();
extern void _ZN6S645C43v17Ev();
extern void _ZN6S645C43v18Ev();
extern void _ZN6S645C43v19Ev();
extern void _ZN6S645C33v20Ev();
extern void _ZN6S645C33v21Ev();
extern void _ZN6S645C33v22Ev();
extern void _ZN6S645C33v23Ev();
static  VTBL_ENTRY vtc_S645C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S645C3[0]),
  (VTBL_ENTRY)&_ZN6S645C3D1Ev,
  (VTBL_ENTRY)&_ZN6S645C3D0Ev,
  (VTBL_ENTRY)&_ZN6S645C52v5Ev,
  (VTBL_ENTRY)&_ZN6S645C52v6Ev,
  (VTBL_ENTRY)&_ZN6S645C52v7Ev,
  (VTBL_ENTRY)&_ZN6S645C52v8Ev,
  (VTBL_ENTRY)&_ZN6S645C52v9Ev,
  (VTBL_ENTRY)&_ZN6S645C53v10Ev,
  (VTBL_ENTRY)&_ZN6S645C53v11Ev,
  (VTBL_ENTRY)&_ZN6S645C53v12Ev,
  (VTBL_ENTRY)&_ZN6S645C53v13Ev,
  (VTBL_ENTRY)&_ZN6S645C53v14Ev,
  (VTBL_ENTRY)&_ZN6S645C43v15Ev,
  (VTBL_ENTRY)&_ZN6S645C43v16Ev,
  (VTBL_ENTRY)&_ZN6S645C43v17Ev,
  (VTBL_ENTRY)&_ZN6S645C43v18Ev,
  (VTBL_ENTRY)&_ZN6S645C43v19Ev,
  (VTBL_ENTRY)&_ZN6S645C33v20Ev,
  (VTBL_ENTRY)&_ZN6S645C33v21Ev,
  (VTBL_ENTRY)&_ZN6S645C33v22Ev,
  (VTBL_ENTRY)&_ZN6S645C33v23Ev,
};
extern VTBL_ENTRY _ZTI6S645C3[];
extern  VTBL_ENTRY _ZTV6S645C3[];
Class_Descriptor cd_S645C3 = {  "S645C3", // class name
  bases_S645C3, 2,
  &(vtc_S645C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI6S645C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S645C3),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S645C2  : S645C3 {
  char s645c2f0;
  int s645c2f1;
  virtual void  v24(); // _ZN6S645C23v24Ev
  virtual void  v25(); // _ZN6S645C23v25Ev
  virtual void  v26(); // _ZN6S645C23v26Ev
  virtual void  v27(); // _ZN6S645C23v27Ev
  ~S645C2(); // tgen
  S645C2(); // tgen
};
//SIG(-1 S645C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fc} v1 v2 v3 v4 Fc Fi}


void  S645C2 ::v24(){vfunc_called(this, "_ZN6S645C23v24Ev");}
void  S645C2 ::v25(){vfunc_called(this, "_ZN6S645C23v25Ev");}
void  S645C2 ::v26(){vfunc_called(this, "_ZN6S645C23v26Ev");}
void  S645C2 ::v27(){vfunc_called(this, "_ZN6S645C23v27Ev");}
S645C2 ::~S645C2(){ note_dtor("S645C2", this);} // tgen
S645C2 ::S645C2(){ note_ctor("S645C2", this);} // tgen

static void Test_S645C2()
{
  extern Class_Descriptor cd_S645C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S645C2, buf);
    S645C2 *dp, &lv = *(dp=new (buf) S645C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S645C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S645C2)");
    check_base_class_offset(lv, (S645C5*)(S645C4*)(S645C3*), 0, "S645C2");
    check_base_class_offset(lv, (S645C4*)(S645C3*), 0, "S645C2");
    check_base_class_offset(lv, (S645C3*), 0, "S645C2");
    check_field_offset(lv, s645c2f0, ABISELECT(185,121), "S645C2.s645c2f0");
    check_field_offset(lv, s645c2f1, ABISELECT(188,124), "S645C2.s645c2f1");
    test_class_info(&lv, &cd_S645C2);
    dp->~S645C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS645C2(Test_S645C2, "S645C2", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN6S645C2C1Ev();
extern void _ZN6S645C2D1Ev();
Name_Map name_map_S645C2[] = {
  NSPAIR(_ZN6S645C2C1Ev),
  NSPAIR(_ZN6S645C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S645C5;
extern VTBL_ENTRY _ZTI6S645C5[];
extern  VTBL_ENTRY _ZTV6S645C5[];
extern Class_Descriptor cd_S645C4;
extern VTBL_ENTRY _ZTI6S645C4[];
extern  VTBL_ENTRY _ZTV6S645C4[];
extern Class_Descriptor cd_S645C3;
extern VTBL_ENTRY _ZTI6S645C3[];
extern  VTBL_ENTRY _ZTV6S645C3[];
static Base_Class bases_S645C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S645C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S645C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S645C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S645C2[];
extern void _ZN6S645C2D1Ev();
extern void _ZN6S645C2D0Ev();
extern void _ZN6S645C52v5Ev();
extern void _ZN6S645C52v6Ev();
extern void _ZN6S645C52v7Ev();
extern void _ZN6S645C52v8Ev();
extern void _ZN6S645C52v9Ev();
extern void _ZN6S645C53v10Ev();
extern void _ZN6S645C53v11Ev();
extern void _ZN6S645C53v12Ev();
extern void _ZN6S645C53v13Ev();
extern void _ZN6S645C53v14Ev();
extern void _ZN6S645C43v15Ev();
extern void _ZN6S645C43v16Ev();
extern void _ZN6S645C43v17Ev();
extern void _ZN6S645C43v18Ev();
extern void _ZN6S645C43v19Ev();
extern void _ZN6S645C33v20Ev();
extern void _ZN6S645C33v21Ev();
extern void _ZN6S645C33v22Ev();
extern void _ZN6S645C33v23Ev();
extern void _ZN6S645C23v24Ev();
extern void _ZN6S645C23v25Ev();
extern void _ZN6S645C23v26Ev();
extern void _ZN6S645C23v27Ev();
static  VTBL_ENTRY vtc_S645C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S645C2[0]),
  (VTBL_ENTRY)&_ZN6S645C2D1Ev,
  (VTBL_ENTRY)&_ZN6S645C2D0Ev,
  (VTBL_ENTRY)&_ZN6S645C52v5Ev,
  (VTBL_ENTRY)&_ZN6S645C52v6Ev,
  (VTBL_ENTRY)&_ZN6S645C52v7Ev,
  (VTBL_ENTRY)&_ZN6S645C52v8Ev,
  (VTBL_ENTRY)&_ZN6S645C52v9Ev,
  (VTBL_ENTRY)&_ZN6S645C53v10Ev,
  (VTBL_ENTRY)&_ZN6S645C53v11Ev,
  (VTBL_ENTRY)&_ZN6S645C53v12Ev,
  (VTBL_ENTRY)&_ZN6S645C53v13Ev,
  (VTBL_ENTRY)&_ZN6S645C53v14Ev,
  (VTBL_ENTRY)&_ZN6S645C43v15Ev,
  (VTBL_ENTRY)&_ZN6S645C43v16Ev,
  (VTBL_ENTRY)&_ZN6S645C43v17Ev,
  (VTBL_ENTRY)&_ZN6S645C43v18Ev,
  (VTBL_ENTRY)&_ZN6S645C43v19Ev,
  (VTBL_ENTRY)&_ZN6S645C33v20Ev,
  (VTBL_ENTRY)&_ZN6S645C33v21Ev,
  (VTBL_ENTRY)&_ZN6S645C33v22Ev,
  (VTBL_ENTRY)&_ZN6S645C33v23Ev,
  (VTBL_ENTRY)&_ZN6S645C23v24Ev,
  (VTBL_ENTRY)&_ZN6S645C23v25Ev,
  (VTBL_ENTRY)&_ZN6S645C23v26Ev,
  (VTBL_ENTRY)&_ZN6S645C23v27Ev,
};
extern VTBL_ENTRY _ZTI6S645C2[];
extern  VTBL_ENTRY _ZTV6S645C2[];
Class_Descriptor cd_S645C2 = {  "S645C2", // class name
  bases_S645C2, 3,
  &(vtc_S645C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI6S645C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S645C2),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S645C1  : S645C2 {
  ::S10103C82_nt s645c1f0;
  ::S10103C82_nt s645c1f1;
  virtual  ~S645C1(); // _ZN6S645C1D1Ev
  virtual void  v1(); // _ZN6S645C12v1Ev
  virtual void  v2(); // _ZN6S645C12v2Ev
  virtual void  v3(); // _ZN6S645C12v3Ev
  virtual void  v4(); // _ZN6S645C12v4Ev
  S645C1(); // tgen
};
//SIG(1 S645C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC6 FC6 FC6 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC9 FC9} v20 v21 v22 v23 Fc} v24 v25 v26 v27 Fc Fi} vd v1 v2 v3 v4 FC12{ m FC13{ m FL[2]}} FC12}


 S645C1 ::~S645C1(){ note_dtor("S645C1", this);}
void  S645C1 ::v1(){vfunc_called(this, "_ZN6S645C12v1Ev");}
void  S645C1 ::v2(){vfunc_called(this, "_ZN6S645C12v2Ev");}
void  S645C1 ::v3(){vfunc_called(this, "_ZN6S645C12v3Ev");}
void  S645C1 ::v4(){vfunc_called(this, "_ZN6S645C12v4Ev");}
S645C1 ::S645C1(){ note_ctor("S645C1", this);} // tgen

static void Test_S645C1()
{
  extern Class_Descriptor cd_S645C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(29,41)];
    init_test(&cd_S645C1, buf);
    S645C1 *dp, &lv = *(dp=new (buf) S645C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(224,160), "sizeof(S645C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S645C1)");
    check_base_class_offset(lv, (S645C5*)(S645C4*)(S645C3*)(S645C2*), 0, "S645C1");
    check_base_class_offset(lv, (S645C4*)(S645C3*)(S645C2*), 0, "S645C1");
    check_base_class_offset(lv, (S645C3*)(S645C2*), 0, "S645C1");
    check_base_class_offset(lv, (S645C2*), 0, "S645C1");
    check_field_offset(lv, s645c1f0, ABISELECT(192,128), "S645C1.s645c1f0");
    check_field_offset(lv, s645c1f1, ABISELECT(208,144), "S645C1.s645c1f1");
    test_class_info(&lv, &cd_S645C1);
    dp->~S645C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS645C1(Test_S645C1, "S645C1", ABISELECT(224,160));

#else // __cplusplus

extern void _ZN6S645C1C1Ev();
extern void _ZN6S645C1D1Ev();
Name_Map name_map_S645C1[] = {
  NSPAIR(_ZN6S645C1C1Ev),
  NSPAIR(_ZN6S645C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S645C5;
extern VTBL_ENTRY _ZTI6S645C5[];
extern  VTBL_ENTRY _ZTV6S645C5[];
extern Class_Descriptor cd_S645C4;
extern VTBL_ENTRY _ZTI6S645C4[];
extern  VTBL_ENTRY _ZTV6S645C4[];
extern Class_Descriptor cd_S645C3;
extern VTBL_ENTRY _ZTI6S645C3[];
extern  VTBL_ENTRY _ZTV6S645C3[];
extern Class_Descriptor cd_S645C2;
extern VTBL_ENTRY _ZTI6S645C2[];
extern  VTBL_ENTRY _ZTV6S645C2[];
static Base_Class bases_S645C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S645C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S645C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S645C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S645C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S645C1[];
extern void _ZN6S645C1D1Ev();
extern void _ZN6S645C1D0Ev();
extern void _ZN6S645C52v5Ev();
extern void _ZN6S645C52v6Ev();
extern void _ZN6S645C52v7Ev();
extern void _ZN6S645C52v8Ev();
extern void _ZN6S645C52v9Ev();
extern void _ZN6S645C53v10Ev();
extern void _ZN6S645C53v11Ev();
extern void _ZN6S645C53v12Ev();
extern void _ZN6S645C53v13Ev();
extern void _ZN6S645C53v14Ev();
extern void _ZN6S645C43v15Ev();
extern void _ZN6S645C43v16Ev();
extern void _ZN6S645C43v17Ev();
extern void _ZN6S645C43v18Ev();
extern void _ZN6S645C43v19Ev();
extern void _ZN6S645C33v20Ev();
extern void _ZN6S645C33v21Ev();
extern void _ZN6S645C33v22Ev();
extern void _ZN6S645C33v23Ev();
extern void _ZN6S645C23v24Ev();
extern void _ZN6S645C23v25Ev();
extern void _ZN6S645C23v26Ev();
extern void _ZN6S645C23v27Ev();
extern void _ZN6S645C12v1Ev();
extern void _ZN6S645C12v2Ev();
extern void _ZN6S645C12v3Ev();
extern void _ZN6S645C12v4Ev();
static  VTBL_ENTRY vtc_S645C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S645C1[0]),
  (VTBL_ENTRY)&_ZN6S645C1D1Ev,
  (VTBL_ENTRY)&_ZN6S645C1D0Ev,
  (VTBL_ENTRY)&_ZN6S645C52v5Ev,
  (VTBL_ENTRY)&_ZN6S645C52v6Ev,
  (VTBL_ENTRY)&_ZN6S645C52v7Ev,
  (VTBL_ENTRY)&_ZN6S645C52v8Ev,
  (VTBL_ENTRY)&_ZN6S645C52v9Ev,
  (VTBL_ENTRY)&_ZN6S645C53v10Ev,
  (VTBL_ENTRY)&_ZN6S645C53v11Ev,
  (VTBL_ENTRY)&_ZN6S645C53v12Ev,
  (VTBL_ENTRY)&_ZN6S645C53v13Ev,
  (VTBL_ENTRY)&_ZN6S645C53v14Ev,
  (VTBL_ENTRY)&_ZN6S645C43v15Ev,
  (VTBL_ENTRY)&_ZN6S645C43v16Ev,
  (VTBL_ENTRY)&_ZN6S645C43v17Ev,
  (VTBL_ENTRY)&_ZN6S645C43v18Ev,
  (VTBL_ENTRY)&_ZN6S645C43v19Ev,
  (VTBL_ENTRY)&_ZN6S645C33v20Ev,
  (VTBL_ENTRY)&_ZN6S645C33v21Ev,
  (VTBL_ENTRY)&_ZN6S645C33v22Ev,
  (VTBL_ENTRY)&_ZN6S645C33v23Ev,
  (VTBL_ENTRY)&_ZN6S645C23v24Ev,
  (VTBL_ENTRY)&_ZN6S645C23v25Ev,
  (VTBL_ENTRY)&_ZN6S645C23v26Ev,
  (VTBL_ENTRY)&_ZN6S645C23v27Ev,
  (VTBL_ENTRY)&_ZN6S645C12v1Ev,
  (VTBL_ENTRY)&_ZN6S645C12v2Ev,
  (VTBL_ENTRY)&_ZN6S645C12v3Ev,
  (VTBL_ENTRY)&_ZN6S645C12v4Ev,
};
extern VTBL_ENTRY _ZTI6S645C1[];
extern  VTBL_ENTRY _ZTV6S645C1[];
Class_Descriptor cd_S645C1 = {  "S645C1", // class name
  bases_S645C1, 4,
  &(vtc_S645C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(224,160), // object size
  NSPAIRA(_ZTI6S645C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S645C1),31, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1484C4  {
  void *s1484c4f0[2];
  ::S10103C13_nt s1484c4f1;
  void *s1484c4f2;
  virtual  ~S1484C4(); // _ZN7S1484C4D1Ev
  virtual void  v5(); // _ZN7S1484C42v5Ev
  virtual void  v6(); // _ZN7S1484C42v6Ev
  virtual void  v7(); // _ZN7S1484C42v7Ev
  virtual void  v8(); // _ZN7S1484C42v8Ev
  virtual void  v9(); // _ZN7S1484C42v9Ev
  virtual void  v10(); // _ZN7S1484C43v10Ev
  virtual void  v11(); // _ZN7S1484C43v11Ev
  virtual void  v12(); // _ZN7S1484C43v12Ev
  virtual void  v13(); // _ZN7S1484C43v13Ev
  virtual void  v14(); // _ZN7S1484C43v14Ev
  S1484C4(); // tgen
};
//SIG(-1 S1484C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1484C4 ::~S1484C4(){ note_dtor("S1484C4", this);}
void  S1484C4 ::v5(){vfunc_called(this, "_ZN7S1484C42v5Ev");}
void  S1484C4 ::v6(){vfunc_called(this, "_ZN7S1484C42v6Ev");}
void  S1484C4 ::v7(){vfunc_called(this, "_ZN7S1484C42v7Ev");}
void  S1484C4 ::v8(){vfunc_called(this, "_ZN7S1484C42v8Ev");}
void  S1484C4 ::v9(){vfunc_called(this, "_ZN7S1484C42v9Ev");}
void  S1484C4 ::v10(){vfunc_called(this, "_ZN7S1484C43v10Ev");}
void  S1484C4 ::v11(){vfunc_called(this, "_ZN7S1484C43v11Ev");}
void  S1484C4 ::v12(){vfunc_called(this, "_ZN7S1484C43v12Ev");}
void  S1484C4 ::v13(){vfunc_called(this, "_ZN7S1484C43v13Ev");}
void  S1484C4 ::v14(){vfunc_called(this, "_ZN7S1484C43v14Ev");}
S1484C4 ::S1484C4(){ note_ctor("S1484C4", this);} // tgen

static void Test_S1484C4()
{
  extern Class_Descriptor cd_S1484C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1484C4, buf);
    S1484C4 *dp, &lv = *(dp=new (buf) S1484C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1484C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1484C4)");
    check_field_offset(lv, s1484c4f0, ABISELECT(8,4), "S1484C4.s1484c4f0");
    check_field_offset(lv, s1484c4f1, ABISELECT(24,12), "S1484C4.s1484c4f1");
    check_field_offset(lv, s1484c4f2, ABISELECT(48,28), "S1484C4.s1484c4f2");
    test_class_info(&lv, &cd_S1484C4);
    dp->~S1484C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1484C4(Test_S1484C4, "S1484C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1484C4C1Ev();
extern void _ZN7S1484C4D1Ev();
Name_Map name_map_S1484C4[] = {
  NSPAIR(_ZN7S1484C4C1Ev),
  NSPAIR(_ZN7S1484C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1484C4[];
extern void _ZN7S1484C4D1Ev();
extern void _ZN7S1484C4D0Ev();
extern void _ZN7S1484C42v5Ev();
extern void _ZN7S1484C42v6Ev();
extern void _ZN7S1484C42v7Ev();
extern void _ZN7S1484C42v8Ev();
extern void _ZN7S1484C42v9Ev();
extern void _ZN7S1484C43v10Ev();
extern void _ZN7S1484C43v11Ev();
extern void _ZN7S1484C43v12Ev();
extern void _ZN7S1484C43v13Ev();
extern void _ZN7S1484C43v14Ev();
static  VTBL_ENTRY vtc_S1484C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1484C4[0]),
  (VTBL_ENTRY)&_ZN7S1484C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1484C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1484C4[];
extern  VTBL_ENTRY _ZTV7S1484C4[];
Class_Descriptor cd_S1484C4 = {  "S1484C4", // class name
  0,0,//no base classes
  &(vtc_S1484C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1484C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1484C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1484C3  : S1484C4 {
  void *s1484c3f0;
  ::S10103C13_nt s1484c3f1;
  ::S10103C13_nt s1484c3f2;
  ::S10103C13_nt s1484c3f3;
  ::S10103C86 s1484c3f4;
  ::S10103C86 s1484c3f5;
  ::S10103C86 s1484c3f6;
  virtual  ~S1484C3(); // _ZN7S1484C3D1Ev
  virtual void  v15(); // _ZN7S1484C33v15Ev
  virtual void  v16(); // _ZN7S1484C33v16Ev
  virtual void  v17(); // _ZN7S1484C33v17Ev
  virtual void  v18(); // _ZN7S1484C33v18Ev
  virtual void  v19(); // _ZN7S1484C33v19Ev
  S1484C3(); // tgen
};
//SIG(-1 S1484C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1484C3 ::~S1484C3(){ note_dtor("S1484C3", this);}
void  S1484C3 ::v15(){vfunc_called(this, "_ZN7S1484C33v15Ev");}
void  S1484C3 ::v16(){vfunc_called(this, "_ZN7S1484C33v16Ev");}
void  S1484C3 ::v17(){vfunc_called(this, "_ZN7S1484C33v17Ev");}
void  S1484C3 ::v18(){vfunc_called(this, "_ZN7S1484C33v18Ev");}
void  S1484C3 ::v19(){vfunc_called(this, "_ZN7S1484C33v19Ev");}
S1484C3 ::S1484C3(){ note_ctor("S1484C3", this);} // tgen

static void Test_S1484C3()
{
  extern Class_Descriptor cd_S1484C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1484C3, buf);
    S1484C3 *dp, &lv = *(dp=new (buf) S1484C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1484C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1484C3)");
    check_base_class_offset(lv, (S1484C4*), 0, "S1484C3");
    check_field_offset(lv, s1484c3f0, ABISELECT(56,32), "S1484C3.s1484c3f0");
    check_field_offset(lv, s1484c3f1, ABISELECT(64,36), "S1484C3.s1484c3f1");
    check_field_offset(lv, s1484c3f2, ABISELECT(88,52), "S1484C3.s1484c3f2");
    check_field_offset(lv, s1484c3f3, ABISELECT(112,68), "S1484C3.s1484c3f3");
    check_field_offset(lv, s1484c3f4, ABISELECT(136,84), "S1484C3.s1484c3f4");
    check_field_offset(lv, s1484c3f5, ABISELECT(152,96), "S1484C3.s1484c3f5");
    check_field_offset(lv, s1484c3f6, ABISELECT(168,108), "S1484C3.s1484c3f6");
    test_class_info(&lv, &cd_S1484C3);
    dp->~S1484C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1484C3(Test_S1484C3, "S1484C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1484C3C1Ev();
extern void _ZN7S1484C3D1Ev();
Name_Map name_map_S1484C3[] = {
  NSPAIR(_ZN7S1484C3C1Ev),
  NSPAIR(_ZN7S1484C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1484C4;
extern VTBL_ENTRY _ZTI7S1484C4[];
extern  VTBL_ENTRY _ZTV7S1484C4[];
static Base_Class bases_S1484C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1484C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1484C3[];
extern void _ZN7S1484C3D1Ev();
extern void _ZN7S1484C3D0Ev();
extern void _ZN7S1484C42v5Ev();
extern void _ZN7S1484C42v6Ev();
extern void _ZN7S1484C42v7Ev();
extern void _ZN7S1484C42v8Ev();
extern void _ZN7S1484C42v9Ev();
extern void _ZN7S1484C43v10Ev();
extern void _ZN7S1484C43v11Ev();
extern void _ZN7S1484C43v12Ev();
extern void _ZN7S1484C43v13Ev();
extern void _ZN7S1484C43v14Ev();
extern void _ZN7S1484C33v15Ev();
extern void _ZN7S1484C33v16Ev();
extern void _ZN7S1484C33v17Ev();
extern void _ZN7S1484C33v18Ev();
extern void _ZN7S1484C33v19Ev();
static  VTBL_ENTRY vtc_S1484C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1484C3[0]),
  (VTBL_ENTRY)&_ZN7S1484C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1484C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1484C3[];
extern  VTBL_ENTRY _ZTV7S1484C3[];
Class_Descriptor cd_S1484C3 = {  "S1484C3", // class name
  bases_S1484C3, 1,
  &(vtc_S1484C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1484C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1484C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1484C2  : S1484C3 {
  int s1484c2f0[4];
  char s1484c2f1;
  ::S10103C13_nt s1484c2f2;
  virtual  ~S1484C2(); // _ZN7S1484C2D1Ev
  virtual void  v20(); // _ZN7S1484C23v20Ev
  virtual void  v21(); // _ZN7S1484C23v21Ev
  virtual void  v22(); // _ZN7S1484C23v22Ev
  virtual void  v23(); // _ZN7S1484C23v23Ev
  S1484C2(); // tgen
};
//SIG(-1 S1484C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 Fi[4] Fc FC4}


 S1484C2 ::~S1484C2(){ note_dtor("S1484C2", this);}
void  S1484C2 ::v20(){vfunc_called(this, "_ZN7S1484C23v20Ev");}
void  S1484C2 ::v21(){vfunc_called(this, "_ZN7S1484C23v21Ev");}
void  S1484C2 ::v22(){vfunc_called(this, "_ZN7S1484C23v22Ev");}
void  S1484C2 ::v23(){vfunc_called(this, "_ZN7S1484C23v23Ev");}
S1484C2 ::S1484C2(){ note_ctor("S1484C2", this);} // tgen

static void Test_S1484C2()
{
  extern Class_Descriptor cd_S1484C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(30,40)];
    init_test(&cd_S1484C2, buf);
    S1484C2 *dp, &lv = *(dp=new (buf) S1484C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(232,156), "sizeof(S1484C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1484C2)");
    check_base_class_offset(lv, (S1484C4*)(S1484C3*), 0, "S1484C2");
    check_base_class_offset(lv, (S1484C3*), 0, "S1484C2");
    check_field_offset(lv, s1484c2f0, ABISELECT(184,120), "S1484C2.s1484c2f0");
    check_field_offset(lv, s1484c2f1, ABISELECT(200,136), "S1484C2.s1484c2f1");
    check_field_offset(lv, s1484c2f2, ABISELECT(208,140), "S1484C2.s1484c2f2");
    test_class_info(&lv, &cd_S1484C2);
    dp->~S1484C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1484C2(Test_S1484C2, "S1484C2", ABISELECT(232,156));

#else // __cplusplus

extern void _ZN7S1484C2C1Ev();
extern void _ZN7S1484C2D1Ev();
Name_Map name_map_S1484C2[] = {
  NSPAIR(_ZN7S1484C2C1Ev),
  NSPAIR(_ZN7S1484C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1484C4;
extern VTBL_ENTRY _ZTI7S1484C4[];
extern  VTBL_ENTRY _ZTV7S1484C4[];
extern Class_Descriptor cd_S1484C3;
extern VTBL_ENTRY _ZTI7S1484C3[];
extern  VTBL_ENTRY _ZTV7S1484C3[];
static Base_Class bases_S1484C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1484C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1484C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1484C2[];
extern void _ZN7S1484C2D1Ev();
extern void _ZN7S1484C2D0Ev();
extern void _ZN7S1484C42v5Ev();
extern void _ZN7S1484C42v6Ev();
extern void _ZN7S1484C42v7Ev();
extern void _ZN7S1484C42v8Ev();
extern void _ZN7S1484C42v9Ev();
extern void _ZN7S1484C43v10Ev();
extern void _ZN7S1484C43v11Ev();
extern void _ZN7S1484C43v12Ev();
extern void _ZN7S1484C43v13Ev();
extern void _ZN7S1484C43v14Ev();
extern void _ZN7S1484C33v15Ev();
extern void _ZN7S1484C33v16Ev();
extern void _ZN7S1484C33v17Ev();
extern void _ZN7S1484C33v18Ev();
extern void _ZN7S1484C33v19Ev();
extern void _ZN7S1484C23v20Ev();
extern void _ZN7S1484C23v21Ev();
extern void _ZN7S1484C23v22Ev();
extern void _ZN7S1484C23v23Ev();
static  VTBL_ENTRY vtc_S1484C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1484C2[0]),
  (VTBL_ENTRY)&_ZN7S1484C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1484C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1484C2[];
extern  VTBL_ENTRY _ZTV7S1484C2[];
Class_Descriptor cd_S1484C2 = {  "S1484C2", // class name
  bases_S1484C2, 2,
  &(vtc_S1484C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(232,156), // object size
  NSPAIRA(_ZTI7S1484C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1484C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1484C1  : S1484C2 {
  int s1484c1f0;
  ::S10103C82_nt s1484c1f1;
  int s1484c1f2[3];
  ::S10103C13_nt s1484c1f3;
  virtual  ~S1484C1(); // _ZN7S1484C1D1Ev
  virtual void  v1(); // _ZN7S1484C12v1Ev
  virtual void  v2(); // _ZN7S1484C12v2Ev
  virtual void  v3(); // _ZN7S1484C12v3Ev
  virtual void  v4(); // _ZN7S1484C12v4Ev
  S1484C1(); // tgen
};
//SIG(1 S1484C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} vd v20 v21 v22 v23 Fi[4] Fc FC5} vd v1 v2 v3 v4 Fi FC11{ m FC12{ m FL[2]}} Fi[3] FC5}


 S1484C1 ::~S1484C1(){ note_dtor("S1484C1", this);}
void  S1484C1 ::v1(){vfunc_called(this, "_ZN7S1484C12v1Ev");}
void  S1484C1 ::v2(){vfunc_called(this, "_ZN7S1484C12v2Ev");}
void  S1484C1 ::v3(){vfunc_called(this, "_ZN7S1484C12v3Ev");}
void  S1484C1 ::v4(){vfunc_called(this, "_ZN7S1484C12v4Ev");}
S1484C1 ::S1484C1(){ note_ctor("S1484C1", this);} // tgen

static void Test_S1484C1()
{
  extern Class_Descriptor cd_S1484C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(38,52)];
    init_test(&cd_S1484C1, buf);
    S1484C1 *dp, &lv = *(dp=new (buf) S1484C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(296,204), "sizeof(S1484C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1484C1)");
    check_base_class_offset(lv, (S1484C4*)(S1484C3*)(S1484C2*), 0, "S1484C1");
    check_base_class_offset(lv, (S1484C3*)(S1484C2*), 0, "S1484C1");
    check_base_class_offset(lv, (S1484C2*), 0, "S1484C1");
    check_field_offset(lv, s1484c1f0, ABISELECT(232,156), "S1484C1.s1484c1f0");
    check_field_offset(lv, s1484c1f1, ABISELECT(240,160), "S1484C1.s1484c1f1");
    check_field_offset(lv, s1484c1f2, ABISELECT(256,176), "S1484C1.s1484c1f2");
    check_field_offset(lv, s1484c1f3, ABISELECT(272,188), "S1484C1.s1484c1f3");
    test_class_info(&lv, &cd_S1484C1);
    dp->~S1484C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1484C1(Test_S1484C1, "S1484C1", ABISELECT(296,204));

#else // __cplusplus

extern void _ZN7S1484C1C1Ev();
extern void _ZN7S1484C1D1Ev();
Name_Map name_map_S1484C1[] = {
  NSPAIR(_ZN7S1484C1C1Ev),
  NSPAIR(_ZN7S1484C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1484C4;
extern VTBL_ENTRY _ZTI7S1484C4[];
extern  VTBL_ENTRY _ZTV7S1484C4[];
extern Class_Descriptor cd_S1484C3;
extern VTBL_ENTRY _ZTI7S1484C3[];
extern  VTBL_ENTRY _ZTV7S1484C3[];
extern Class_Descriptor cd_S1484C2;
extern VTBL_ENTRY _ZTI7S1484C2[];
extern  VTBL_ENTRY _ZTV7S1484C2[];
static Base_Class bases_S1484C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1484C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1484C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1484C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1484C1[];
extern void _ZN7S1484C1D1Ev();
extern void _ZN7S1484C1D0Ev();
extern void _ZN7S1484C42v5Ev();
extern void _ZN7S1484C42v6Ev();
extern void _ZN7S1484C42v7Ev();
extern void _ZN7S1484C42v8Ev();
extern void _ZN7S1484C42v9Ev();
extern void _ZN7S1484C43v10Ev();
extern void _ZN7S1484C43v11Ev();
extern void _ZN7S1484C43v12Ev();
extern void _ZN7S1484C43v13Ev();
extern void _ZN7S1484C43v14Ev();
extern void _ZN7S1484C33v15Ev();
extern void _ZN7S1484C33v16Ev();
extern void _ZN7S1484C33v17Ev();
extern void _ZN7S1484C33v18Ev();
extern void _ZN7S1484C33v19Ev();
extern void _ZN7S1484C23v20Ev();
extern void _ZN7S1484C23v21Ev();
extern void _ZN7S1484C23v22Ev();
extern void _ZN7S1484C23v23Ev();
extern void _ZN7S1484C12v1Ev();
extern void _ZN7S1484C12v2Ev();
extern void _ZN7S1484C12v3Ev();
extern void _ZN7S1484C12v4Ev();
static  VTBL_ENTRY vtc_S1484C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1484C1[0]),
  (VTBL_ENTRY)&_ZN7S1484C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1484C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1484C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1484C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1484C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1484C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1484C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1484C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1484C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1484C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1484C1[];
extern  VTBL_ENTRY _ZTV7S1484C1[];
Class_Descriptor cd_S1484C1 = {  "S1484C1", // class name
  bases_S1484C1, 3,
  &(vtc_S1484C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(296,204), // object size
  NSPAIRA(_ZTI7S1484C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1484C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3325C3  {
  void *s3325c3f0[2];
  ::S10103C13_nt s3325c3f1;
  void *s3325c3f2;
  virtual  ~S3325C3(); // _ZN7S3325C3D1Ev
  virtual void  v5(); // _ZN7S3325C32v5Ev
  virtual void  v6(); // _ZN7S3325C32v6Ev
  virtual void  v7(); // _ZN7S3325C32v7Ev
  virtual void  v8(); // _ZN7S3325C32v8Ev
  virtual void  v9(); // _ZN7S3325C32v9Ev
  virtual void  v10(); // _ZN7S3325C33v10Ev
  virtual void  v11(); // _ZN7S3325C33v11Ev
  virtual void  v12(); // _ZN7S3325C33v12Ev
  virtual void  v13(); // _ZN7S3325C33v13Ev
  virtual void  v14(); // _ZN7S3325C33v14Ev
  S3325C3(); // tgen
};
//SIG(-1 S3325C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3325C3 ::~S3325C3(){ note_dtor("S3325C3", this);}
void  S3325C3 ::v5(){vfunc_called(this, "_ZN7S3325C32v5Ev");}
void  S3325C3 ::v6(){vfunc_called(this, "_ZN7S3325C32v6Ev");}
void  S3325C3 ::v7(){vfunc_called(this, "_ZN7S3325C32v7Ev");}
void  S3325C3 ::v8(){vfunc_called(this, "_ZN7S3325C32v8Ev");}
void  S3325C3 ::v9(){vfunc_called(this, "_ZN7S3325C32v9Ev");}
void  S3325C3 ::v10(){vfunc_called(this, "_ZN7S3325C33v10Ev");}
void  S3325C3 ::v11(){vfunc_called(this, "_ZN7S3325C33v11Ev");}
void  S3325C3 ::v12(){vfunc_called(this, "_ZN7S3325C33v12Ev");}
void  S3325C3 ::v13(){vfunc_called(this, "_ZN7S3325C33v13Ev");}
void  S3325C3 ::v14(){vfunc_called(this, "_ZN7S3325C33v14Ev");}
S3325C3 ::S3325C3(){ note_ctor("S3325C3", this);} // tgen

static void Test_S3325C3()
{
  extern Class_Descriptor cd_S3325C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3325C3, buf);
    S3325C3 *dp, &lv = *(dp=new (buf) S3325C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3325C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3325C3)");
    check_field_offset(lv, s3325c3f0, ABISELECT(8,4), "S3325C3.s3325c3f0");
    check_field_offset(lv, s3325c3f1, ABISELECT(24,12), "S3325C3.s3325c3f1");
    check_field_offset(lv, s3325c3f2, ABISELECT(48,28), "S3325C3.s3325c3f2");
    test_class_info(&lv, &cd_S3325C3);
    dp->~S3325C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3325C3(Test_S3325C3, "S3325C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3325C3C1Ev();
extern void _ZN7S3325C3D1Ev();
Name_Map name_map_S3325C3[] = {
  NSPAIR(_ZN7S3325C3C1Ev),
  NSPAIR(_ZN7S3325C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3325C3[];
extern void _ZN7S3325C3D1Ev();
extern void _ZN7S3325C3D0Ev();
extern void _ZN7S3325C32v5Ev();
extern void _ZN7S3325C32v6Ev();
extern void _ZN7S3325C32v7Ev();
extern void _ZN7S3325C32v8Ev();
extern void _ZN7S3325C32v9Ev();
extern void _ZN7S3325C33v10Ev();
extern void _ZN7S3325C33v11Ev();
extern void _ZN7S3325C33v12Ev();
extern void _ZN7S3325C33v13Ev();
extern void _ZN7S3325C33v14Ev();
static  VTBL_ENTRY vtc_S3325C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3325C3[0]),
  (VTBL_ENTRY)&_ZN7S3325C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3325C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3325C3[];
extern  VTBL_ENTRY _ZTV7S3325C3[];
Class_Descriptor cd_S3325C3 = {  "S3325C3", // class name
  0,0,//no base classes
  &(vtc_S3325C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3325C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3325C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3325C2  : S3325C3 {
  ::S10103C86 s3325c2f0;
  ::S10103C106 s3325c2f1;
  ::S10103C82_nt s3325c2f2;
  ::S10103C13_nt s3325c2f3;
  virtual  ~S3325C2(); // _ZN7S3325C2D1Ev
  virtual void  v15(); // _ZN7S3325C23v15Ev
  virtual void  v16(); // _ZN7S3325C23v16Ev
  virtual void  v17(); // _ZN7S3325C23v17Ev
  virtual void  v18(); // _ZN7S3325C23v18Ev
  virtual void  v19(); // _ZN7S3325C23v19Ev
  virtual void  v20(); // _ZN7S3325C23v20Ev
  virtual void  v21(); // _ZN7S3325C23v21Ev
  virtual void  v22(); // _ZN7S3325C23v22Ev
  virtual void  v23(); // _ZN7S3325C23v23Ev
  virtual void  v24(); // _ZN7S3325C23v24Ev
  virtual void  v25(); // _ZN7S3325C23v25Ev
  virtual void  v26(); // _ZN7S3325C23v26Ev
  virtual void  v27(); // _ZN7S3325C23v27Ev
  virtual void  v28(); // _ZN7S3325C23v28Ev
  S3325C2(); // tgen
};
//SIG(-1 S3325C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3325C2 ::~S3325C2(){ note_dtor("S3325C2", this);}
void  S3325C2 ::v15(){vfunc_called(this, "_ZN7S3325C23v15Ev");}
void  S3325C2 ::v16(){vfunc_called(this, "_ZN7S3325C23v16Ev");}
void  S3325C2 ::v17(){vfunc_called(this, "_ZN7S3325C23v17Ev");}
void  S3325C2 ::v18(){vfunc_called(this, "_ZN7S3325C23v18Ev");}
void  S3325C2 ::v19(){vfunc_called(this, "_ZN7S3325C23v19Ev");}
void  S3325C2 ::v20(){vfunc_called(this, "_ZN7S3325C23v20Ev");}
void  S3325C2 ::v21(){vfunc_called(this, "_ZN7S3325C23v21Ev");}
void  S3325C2 ::v22(){vfunc_called(this, "_ZN7S3325C23v22Ev");}
void  S3325C2 ::v23(){vfunc_called(this, "_ZN7S3325C23v23Ev");}
void  S3325C2 ::v24(){vfunc_called(this, "_ZN7S3325C23v24Ev");}
void  S3325C2 ::v25(){vfunc_called(this, "_ZN7S3325C23v25Ev");}
void  S3325C2 ::v26(){vfunc_called(this, "_ZN7S3325C23v26Ev");}
void  S3325C2 ::v27(){vfunc_called(this, "_ZN7S3325C23v27Ev");}
void  S3325C2 ::v28(){vfunc_called(this, "_ZN7S3325C23v28Ev");}
S3325C2 ::S3325C2(){ note_ctor("S3325C2", this);} // tgen

static void Test_S3325C2()
{
  extern Class_Descriptor cd_S3325C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3325C2, buf);
    S3325C2 *dp, &lv = *(dp=new (buf) S3325C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3325C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3325C2)");
    check_base_class_offset(lv, (S3325C3*), 0, "S3325C2");
    check_field_offset(lv, s3325c2f0, ABISELECT(56,32), "S3325C2.s3325c2f0");
    check_field_offset(lv, s3325c2f1, ABISELECT(72,44), "S3325C2.s3325c2f1");
    check_field_offset(lv, s3325c2f2, ABISELECT(96,60), "S3325C2.s3325c2f2");
    check_field_offset(lv, s3325c2f3, ABISELECT(112,76), "S3325C2.s3325c2f3");
    test_class_info(&lv, &cd_S3325C2);
    dp->~S3325C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3325C2(Test_S3325C2, "S3325C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3325C2C1Ev();
extern void _ZN7S3325C2D1Ev();
Name_Map name_map_S3325C2[] = {
  NSPAIR(_ZN7S3325C2C1Ev),
  NSPAIR(_ZN7S3325C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3325C3;
extern VTBL_ENTRY _ZTI7S3325C3[];
extern  VTBL_ENTRY _ZTV7S3325C3[];
static Base_Class bases_S3325C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3325C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3325C2[];
extern void _ZN7S3325C2D1Ev();
extern void _ZN7S3325C2D0Ev();
extern void _ZN7S3325C32v5Ev();
extern void _ZN7S3325C32v6Ev();
extern void _ZN7S3325C32v7Ev();
extern void _ZN7S3325C32v8Ev();
extern void _ZN7S3325C32v9Ev();
extern void _ZN7S3325C33v10Ev();
extern void _ZN7S3325C33v11Ev();
extern void _ZN7S3325C33v12Ev();
extern void _ZN7S3325C33v13Ev();
extern void _ZN7S3325C33v14Ev();
extern void _ZN7S3325C23v15Ev();
extern void _ZN7S3325C23v16Ev();
extern void _ZN7S3325C23v17Ev();
extern void _ZN7S3325C23v18Ev();
extern void _ZN7S3325C23v19Ev();
extern void _ZN7S3325C23v20Ev();
extern void _ZN7S3325C23v21Ev();
extern void _ZN7S3325C23v22Ev();
extern void _ZN7S3325C23v23Ev();
extern void _ZN7S3325C23v24Ev();
extern void _ZN7S3325C23v25Ev();
extern void _ZN7S3325C23v26Ev();
extern void _ZN7S3325C23v27Ev();
extern void _ZN7S3325C23v28Ev();
static  VTBL_ENTRY vtc_S3325C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3325C2[0]),
  (VTBL_ENTRY)&_ZN7S3325C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3325C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v28Ev,
};
extern VTBL_ENTRY _ZTI7S3325C2[];
extern  VTBL_ENTRY _ZTV7S3325C2[];
Class_Descriptor cd_S3325C2 = {  "S3325C2", // class name
  bases_S3325C2, 1,
  &(vtc_S3325C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3325C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3325C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3325C1  : S3325C2 {
  int s3325c1f0;
  ::S10103C82_nt s3325c1f1;
  virtual  ~S3325C1(); // _ZN7S3325C1D1Ev
  virtual void  v1(); // _ZN7S3325C12v1Ev
  virtual void  v2(); // _ZN7S3325C12v2Ev
  virtual void  v3(); // _ZN7S3325C12v3Ev
  virtual void  v4(); // _ZN7S3325C12v4Ev
  S3325C1(); // tgen
};
//SIG(1 S3325C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi FC11}


 S3325C1 ::~S3325C1(){ note_dtor("S3325C1", this);}
void  S3325C1 ::v1(){vfunc_called(this, "_ZN7S3325C12v1Ev");}
void  S3325C1 ::v2(){vfunc_called(this, "_ZN7S3325C12v2Ev");}
void  S3325C1 ::v3(){vfunc_called(this, "_ZN7S3325C12v3Ev");}
void  S3325C1 ::v4(){vfunc_called(this, "_ZN7S3325C12v4Ev");}
S3325C1 ::S3325C1(){ note_ctor("S3325C1", this);} // tgen

static void Test_S3325C1()
{
  extern Class_Descriptor cd_S3325C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(21,29)];
    init_test(&cd_S3325C1, buf);
    S3325C1 *dp, &lv = *(dp=new (buf) S3325C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(160,112), "sizeof(S3325C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3325C1)");
    check_base_class_offset(lv, (S3325C3*)(S3325C2*), 0, "S3325C1");
    check_base_class_offset(lv, (S3325C2*), 0, "S3325C1");
    check_field_offset(lv, s3325c1f0, ABISELECT(136,92), "S3325C1.s3325c1f0");
    check_field_offset(lv, s3325c1f1, ABISELECT(144,96), "S3325C1.s3325c1f1");
    test_class_info(&lv, &cd_S3325C1);
    dp->~S3325C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3325C1(Test_S3325C1, "S3325C1", ABISELECT(160,112));

#else // __cplusplus

extern void _ZN7S3325C1C1Ev();
extern void _ZN7S3325C1D1Ev();
Name_Map name_map_S3325C1[] = {
  NSPAIR(_ZN7S3325C1C1Ev),
  NSPAIR(_ZN7S3325C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3325C3;
extern VTBL_ENTRY _ZTI7S3325C3[];
extern  VTBL_ENTRY _ZTV7S3325C3[];
extern Class_Descriptor cd_S3325C2;
extern VTBL_ENTRY _ZTI7S3325C2[];
extern  VTBL_ENTRY _ZTV7S3325C2[];
static Base_Class bases_S3325C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3325C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3325C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3325C1[];
extern void _ZN7S3325C1D1Ev();
extern void _ZN7S3325C1D0Ev();
extern void _ZN7S3325C32v5Ev();
extern void _ZN7S3325C32v6Ev();
extern void _ZN7S3325C32v7Ev();
extern void _ZN7S3325C32v8Ev();
extern void _ZN7S3325C32v9Ev();
extern void _ZN7S3325C33v10Ev();
extern void _ZN7S3325C33v11Ev();
extern void _ZN7S3325C33v12Ev();
extern void _ZN7S3325C33v13Ev();
extern void _ZN7S3325C33v14Ev();
extern void _ZN7S3325C23v15Ev();
extern void _ZN7S3325C23v16Ev();
extern void _ZN7S3325C23v17Ev();
extern void _ZN7S3325C23v18Ev();
extern void _ZN7S3325C23v19Ev();
extern void _ZN7S3325C23v20Ev();
extern void _ZN7S3325C23v21Ev();
extern void _ZN7S3325C23v22Ev();
extern void _ZN7S3325C23v23Ev();
extern void _ZN7S3325C23v24Ev();
extern void _ZN7S3325C23v25Ev();
extern void _ZN7S3325C23v26Ev();
extern void _ZN7S3325C23v27Ev();
extern void _ZN7S3325C23v28Ev();
extern void _ZN7S3325C12v1Ev();
extern void _ZN7S3325C12v2Ev();
extern void _ZN7S3325C12v3Ev();
extern void _ZN7S3325C12v4Ev();
static  VTBL_ENTRY vtc_S3325C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3325C1[0]),
  (VTBL_ENTRY)&_ZN7S3325C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3325C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3325C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3325C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3325C23v28Ev,
  (VTBL_ENTRY)&_ZN7S3325C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3325C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3325C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3325C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3325C1[];
extern  VTBL_ENTRY _ZTV7S3325C1[];
Class_Descriptor cd_S3325C1 = {  "S3325C1", // class name
  bases_S3325C1, 2,
  &(vtc_S3325C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(160,112), // object size
  NSPAIRA(_ZTI7S3325C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3325C1),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15914C1  {
  ::S2718C16_nt s15914c1f0;
  ::S2718C16_nt s15914c1f1;
  ::S2718C6 s15914c1f2;
  char s15914c1f3[2];
  ::S2718C4_nt s15914c1f4;
  int s15914c1f5;
  char s15914c1f6;
  int s15914c1f7;
  void  mf15914c1(); // _ZN8S15914C19mf15914c1Ev
};
//SIG(1 S15914C1) C1{ m FC2{ m Fi Fc} FC2 FC3{ m FC4{ m FC5{ m FC6{ m FC7{ m FC8{ m Fp}}} FC9{ BC10{ m Fp}}} FC11{ m Fp} Fi[2] Fi:1 Fi:1 Fi:2 Fi:1 Fi:1 Fi:1 Fi:8 Fi:3 Fi:1 Fi:1 Fi:2 Fi:2 Fi:2 Fi:2 Fi:4 Fi:2 Fi:2 Fi:1 Fi} FC11 Fs[2] Fc[2]} Fc[2] FC12{ m Fc[3]} Fi Fc Fi}


void  S15914C1 ::mf15914c1(){}

static void Test_S15914C1()
{
  {
    init_simple_test("S15914C1");
    static S15914C1 lv;
    check2(sizeof(lv), ABISELECT(104,80), "sizeof(S15914C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15914C1)");
    check_field_offset(lv, s15914c1f0, 0, "S15914C1.s15914c1f0");
    check_field_offset(lv, s15914c1f1, 8, "S15914C1.s15914c1f1");
    check_field_offset(lv, s15914c1f2, 16, "S15914C1.s15914c1f2");
    check_field_offset(lv, s15914c1f3, ABISELECT(80,60), "S15914C1.s15914c1f3");
    check_field_offset(lv, s15914c1f4, ABISELECT(82,62), "S15914C1.s15914c1f4");
    check_field_offset(lv, s15914c1f5, ABISELECT(88,68), "S15914C1.s15914c1f5");
    check_field_offset(lv, s15914c1f6, ABISELECT(92,72), "S15914C1.s15914c1f6");
    check_field_offset(lv, s15914c1f7, ABISELECT(96,76), "S15914C1.s15914c1f7");
  }
}
static Arrange_To_Call_Me vS15914C1(Test_S15914C1, "S15914C1", ABISELECT(104,80));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3331C3  {
  void *s3331c3f0[2];
  ::S10103C13_nt s3331c3f1;
  void *s3331c3f2;
  virtual  ~S3331C3(); // _ZN7S3331C3D1Ev
  virtual void  v5(); // _ZN7S3331C32v5Ev
  virtual void  v6(); // _ZN7S3331C32v6Ev
  virtual void  v7(); // _ZN7S3331C32v7Ev
  virtual void  v8(); // _ZN7S3331C32v8Ev
  virtual void  v9(); // _ZN7S3331C32v9Ev
  virtual void  v10(); // _ZN7S3331C33v10Ev
  virtual void  v11(); // _ZN7S3331C33v11Ev
  virtual void  v12(); // _ZN7S3331C33v12Ev
  virtual void  v13(); // _ZN7S3331C33v13Ev
  virtual void  v14(); // _ZN7S3331C33v14Ev
  S3331C3(); // tgen
};
//SIG(-1 S3331C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3331C3 ::~S3331C3(){ note_dtor("S3331C3", this);}
void  S3331C3 ::v5(){vfunc_called(this, "_ZN7S3331C32v5Ev");}
void  S3331C3 ::v6(){vfunc_called(this, "_ZN7S3331C32v6Ev");}
void  S3331C3 ::v7(){vfunc_called(this, "_ZN7S3331C32v7Ev");}
void  S3331C3 ::v8(){vfunc_called(this, "_ZN7S3331C32v8Ev");}
void  S3331C3 ::v9(){vfunc_called(this, "_ZN7S3331C32v9Ev");}
void  S3331C3 ::v10(){vfunc_called(this, "_ZN7S3331C33v10Ev");}
void  S3331C3 ::v11(){vfunc_called(this, "_ZN7S3331C33v11Ev");}
void  S3331C3 ::v12(){vfunc_called(this, "_ZN7S3331C33v12Ev");}
void  S3331C3 ::v13(){vfunc_called(this, "_ZN7S3331C33v13Ev");}
void  S3331C3 ::v14(){vfunc_called(this, "_ZN7S3331C33v14Ev");}
S3331C3 ::S3331C3(){ note_ctor("S3331C3", this);} // tgen

static void Test_S3331C3()
{
  extern Class_Descriptor cd_S3331C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3331C3, buf);
    S3331C3 *dp, &lv = *(dp=new (buf) S3331C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3331C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3331C3)");
    check_field_offset(lv, s3331c3f0, ABISELECT(8,4), "S3331C3.s3331c3f0");
    check_field_offset(lv, s3331c3f1, ABISELECT(24,12), "S3331C3.s3331c3f1");
    check_field_offset(lv, s3331c3f2, ABISELECT(48,28), "S3331C3.s3331c3f2");
    test_class_info(&lv, &cd_S3331C3);
    dp->~S3331C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3331C3(Test_S3331C3, "S3331C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3331C3C1Ev();
extern void _ZN7S3331C3D1Ev();
Name_Map name_map_S3331C3[] = {
  NSPAIR(_ZN7S3331C3C1Ev),
  NSPAIR(_ZN7S3331C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3331C3[];
extern void _ZN7S3331C3D1Ev();
extern void _ZN7S3331C3D0Ev();
extern void _ZN7S3331C32v5Ev();
extern void _ZN7S3331C32v6Ev();
extern void _ZN7S3331C32v7Ev();
extern void _ZN7S3331C32v8Ev();
extern void _ZN7S3331C32v9Ev();
extern void _ZN7S3331C33v10Ev();
extern void _ZN7S3331C33v11Ev();
extern void _ZN7S3331C33v12Ev();
extern void _ZN7S3331C33v13Ev();
extern void _ZN7S3331C33v14Ev();
static  VTBL_ENTRY vtc_S3331C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3331C3[0]),
  (VTBL_ENTRY)&_ZN7S3331C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3331C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3331C3[];
extern  VTBL_ENTRY _ZTV7S3331C3[];
Class_Descriptor cd_S3331C3 = {  "S3331C3", // class name
  0,0,//no base classes
  &(vtc_S3331C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3331C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3331C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3331C2  : S3331C3 {
  ::S10103C86 s3331c2f0;
  ::S10103C106 s3331c2f1;
  ::S10103C82_nt s3331c2f2;
  ::S10103C13_nt s3331c2f3;
  virtual  ~S3331C2(); // _ZN7S3331C2D1Ev
  virtual void  v15(); // _ZN7S3331C23v15Ev
  virtual void  v16(); // _ZN7S3331C23v16Ev
  virtual void  v17(); // _ZN7S3331C23v17Ev
  virtual void  v18(); // _ZN7S3331C23v18Ev
  virtual void  v19(); // _ZN7S3331C23v19Ev
  virtual void  v20(); // _ZN7S3331C23v20Ev
  virtual void  v21(); // _ZN7S3331C23v21Ev
  virtual void  v22(); // _ZN7S3331C23v22Ev
  virtual void  v23(); // _ZN7S3331C23v23Ev
  virtual void  v24(); // _ZN7S3331C23v24Ev
  virtual void  v25(); // _ZN7S3331C23v25Ev
  virtual void  v26(); // _ZN7S3331C23v26Ev
  virtual void  v27(); // _ZN7S3331C23v27Ev
  virtual void  v28(); // _ZN7S3331C23v28Ev
  S3331C2(); // tgen
};
//SIG(-1 S3331C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3331C2 ::~S3331C2(){ note_dtor("S3331C2", this);}
void  S3331C2 ::v15(){vfunc_called(this, "_ZN7S3331C23v15Ev");}
void  S3331C2 ::v16(){vfunc_called(this, "_ZN7S3331C23v16Ev");}
void  S3331C2 ::v17(){vfunc_called(this, "_ZN7S3331C23v17Ev");}
void  S3331C2 ::v18(){vfunc_called(this, "_ZN7S3331C23v18Ev");}
void  S3331C2 ::v19(){vfunc_called(this, "_ZN7S3331C23v19Ev");}
void  S3331C2 ::v20(){vfunc_called(this, "_ZN7S3331C23v20Ev");}
void  S3331C2 ::v21(){vfunc_called(this, "_ZN7S3331C23v21Ev");}
void  S3331C2 ::v22(){vfunc_called(this, "_ZN7S3331C23v22Ev");}
void  S3331C2 ::v23(){vfunc_called(this, "_ZN7S3331C23v23Ev");}
void  S3331C2 ::v24(){vfunc_called(this, "_ZN7S3331C23v24Ev");}
void  S3331C2 ::v25(){vfunc_called(this, "_ZN7S3331C23v25Ev");}
void  S3331C2 ::v26(){vfunc_called(this, "_ZN7S3331C23v26Ev");}
void  S3331C2 ::v27(){vfunc_called(this, "_ZN7S3331C23v27Ev");}
void  S3331C2 ::v28(){vfunc_called(this, "_ZN7S3331C23v28Ev");}
S3331C2 ::S3331C2(){ note_ctor("S3331C2", this);} // tgen

static void Test_S3331C2()
{
  extern Class_Descriptor cd_S3331C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3331C2, buf);
    S3331C2 *dp, &lv = *(dp=new (buf) S3331C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3331C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3331C2)");
    check_base_class_offset(lv, (S3331C3*), 0, "S3331C2");
    check_field_offset(lv, s3331c2f0, ABISELECT(56,32), "S3331C2.s3331c2f0");
    check_field_offset(lv, s3331c2f1, ABISELECT(72,44), "S3331C2.s3331c2f1");
    check_field_offset(lv, s3331c2f2, ABISELECT(96,60), "S3331C2.s3331c2f2");
    check_field_offset(lv, s3331c2f3, ABISELECT(112,76), "S3331C2.s3331c2f3");
    test_class_info(&lv, &cd_S3331C2);
    dp->~S3331C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3331C2(Test_S3331C2, "S3331C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3331C2C1Ev();
extern void _ZN7S3331C2D1Ev();
Name_Map name_map_S3331C2[] = {
  NSPAIR(_ZN7S3331C2C1Ev),
  NSPAIR(_ZN7S3331C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3331C3;
extern VTBL_ENTRY _ZTI7S3331C3[];
extern  VTBL_ENTRY _ZTV7S3331C3[];
static Base_Class bases_S3331C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3331C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3331C2[];
extern void _ZN7S3331C2D1Ev();
extern void _ZN7S3331C2D0Ev();
extern void _ZN7S3331C32v5Ev();
extern void _ZN7S3331C32v6Ev();
extern void _ZN7S3331C32v7Ev();
extern void _ZN7S3331C32v8Ev();
extern void _ZN7S3331C32v9Ev();
extern void _ZN7S3331C33v10Ev();
extern void _ZN7S3331C33v11Ev();
extern void _ZN7S3331C33v12Ev();
extern void _ZN7S3331C33v13Ev();
extern void _ZN7S3331C33v14Ev();
extern void _ZN7S3331C23v15Ev();
extern void _ZN7S3331C23v16Ev();
extern void _ZN7S3331C23v17Ev();
extern void _ZN7S3331C23v18Ev();
extern void _ZN7S3331C23v19Ev();
extern void _ZN7S3331C23v20Ev();
extern void _ZN7S3331C23v21Ev();
extern void _ZN7S3331C23v22Ev();
extern void _ZN7S3331C23v23Ev();
extern void _ZN7S3331C23v24Ev();
extern void _ZN7S3331C23v25Ev();
extern void _ZN7S3331C23v26Ev();
extern void _ZN7S3331C23v27Ev();
extern void _ZN7S3331C23v28Ev();
static  VTBL_ENTRY vtc_S3331C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3331C2[0]),
  (VTBL_ENTRY)&_ZN7S3331C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3331C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v28Ev,
};
extern VTBL_ENTRY _ZTI7S3331C2[];
extern  VTBL_ENTRY _ZTV7S3331C2[];
Class_Descriptor cd_S3331C2 = {  "S3331C2", // class name
  bases_S3331C2, 1,
  &(vtc_S3331C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3331C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3331C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3331C1  : S3331C2 {
  int s3331c1f0;
  virtual  ~S3331C1(); // _ZN7S3331C1D1Ev
  virtual void  v1(); // _ZN7S3331C12v1Ev
  virtual void  v2(); // _ZN7S3331C12v2Ev
  virtual void  v3(); // _ZN7S3331C12v3Ev
  virtual void  v4(); // _ZN7S3331C12v4Ev
  S3331C1(); // tgen
};
//SIG(1 S3331C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} vd v1 v2 v3 v4 Fi}


 S3331C1 ::~S3331C1(){ note_dtor("S3331C1", this);}
void  S3331C1 ::v1(){vfunc_called(this, "_ZN7S3331C12v1Ev");}
void  S3331C1 ::v2(){vfunc_called(this, "_ZN7S3331C12v2Ev");}
void  S3331C1 ::v3(){vfunc_called(this, "_ZN7S3331C12v3Ev");}
void  S3331C1 ::v4(){vfunc_called(this, "_ZN7S3331C12v4Ev");}
S3331C1 ::S3331C1(){ note_ctor("S3331C1", this);} // tgen

static void Test_S3331C1()
{
  extern Class_Descriptor cd_S3331C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(19,25)];
    init_test(&cd_S3331C1, buf);
    S3331C1 *dp, &lv = *(dp=new (buf) S3331C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(144,96), "sizeof(S3331C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3331C1)");
    check_base_class_offset(lv, (S3331C3*)(S3331C2*), 0, "S3331C1");
    check_base_class_offset(lv, (S3331C2*), 0, "S3331C1");
    check_field_offset(lv, s3331c1f0, ABISELECT(136,92), "S3331C1.s3331c1f0");
    test_class_info(&lv, &cd_S3331C1);
    dp->~S3331C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3331C1(Test_S3331C1, "S3331C1", ABISELECT(144,96));

#else // __cplusplus

extern void _ZN7S3331C1C1Ev();
extern void _ZN7S3331C1D1Ev();
Name_Map name_map_S3331C1[] = {
  NSPAIR(_ZN7S3331C1C1Ev),
  NSPAIR(_ZN7S3331C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3331C3;
extern VTBL_ENTRY _ZTI7S3331C3[];
extern  VTBL_ENTRY _ZTV7S3331C3[];
extern Class_Descriptor cd_S3331C2;
extern VTBL_ENTRY _ZTI7S3331C2[];
extern  VTBL_ENTRY _ZTV7S3331C2[];
static Base_Class bases_S3331C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3331C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3331C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3331C1[];
extern void _ZN7S3331C1D1Ev();
extern void _ZN7S3331C1D0Ev();
extern void _ZN7S3331C32v5Ev();
extern void _ZN7S3331C32v6Ev();
extern void _ZN7S3331C32v7Ev();
extern void _ZN7S3331C32v8Ev();
extern void _ZN7S3331C32v9Ev();
extern void _ZN7S3331C33v10Ev();
extern void _ZN7S3331C33v11Ev();
extern void _ZN7S3331C33v12Ev();
extern void _ZN7S3331C33v13Ev();
extern void _ZN7S3331C33v14Ev();
extern void _ZN7S3331C23v15Ev();
extern void _ZN7S3331C23v16Ev();
extern void _ZN7S3331C23v17Ev();
extern void _ZN7S3331C23v18Ev();
extern void _ZN7S3331C23v19Ev();
extern void _ZN7S3331C23v20Ev();
extern void _ZN7S3331C23v21Ev();
extern void _ZN7S3331C23v22Ev();
extern void _ZN7S3331C23v23Ev();
extern void _ZN7S3331C23v24Ev();
extern void _ZN7S3331C23v25Ev();
extern void _ZN7S3331C23v26Ev();
extern void _ZN7S3331C23v27Ev();
extern void _ZN7S3331C23v28Ev();
extern void _ZN7S3331C12v1Ev();
extern void _ZN7S3331C12v2Ev();
extern void _ZN7S3331C12v3Ev();
extern void _ZN7S3331C12v4Ev();
static  VTBL_ENTRY vtc_S3331C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3331C1[0]),
  (VTBL_ENTRY)&_ZN7S3331C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3331C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3331C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3331C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v26Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v27Ev,
  (VTBL_ENTRY)&_ZN7S3331C23v28Ev,
  (VTBL_ENTRY)&_ZN7S3331C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3331C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3331C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3331C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3331C1[];
extern  VTBL_ENTRY _ZTV7S3331C1[];
Class_Descriptor cd_S3331C1 = {  "S3331C1", // class name
  bases_S3331C1, 2,
  &(vtc_S3331C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(144,96), // object size
  NSPAIRA(_ZTI7S3331C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3331C1),32, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1483C4  {
  void *s1483c4f0[2];
  ::S10103C13_nt s1483c4f1;
  void *s1483c4f2;
  virtual  ~S1483C4(); // _ZN7S1483C4D1Ev
  virtual void  v5(); // _ZN7S1483C42v5Ev
  virtual void  v6(); // _ZN7S1483C42v6Ev
  virtual void  v7(); // _ZN7S1483C42v7Ev
  virtual void  v8(); // _ZN7S1483C42v8Ev
  virtual void  v9(); // _ZN7S1483C42v9Ev
  virtual void  v10(); // _ZN7S1483C43v10Ev
  virtual void  v11(); // _ZN7S1483C43v11Ev
  virtual void  v12(); // _ZN7S1483C43v12Ev
  virtual void  v13(); // _ZN7S1483C43v13Ev
  virtual void  v14(); // _ZN7S1483C43v14Ev
  S1483C4(); // tgen
};
//SIG(-1 S1483C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1483C4 ::~S1483C4(){ note_dtor("S1483C4", this);}
void  S1483C4 ::v5(){vfunc_called(this, "_ZN7S1483C42v5Ev");}
void  S1483C4 ::v6(){vfunc_called(this, "_ZN7S1483C42v6Ev");}
void  S1483C4 ::v7(){vfunc_called(this, "_ZN7S1483C42v7Ev");}
void  S1483C4 ::v8(){vfunc_called(this, "_ZN7S1483C42v8Ev");}
void  S1483C4 ::v9(){vfunc_called(this, "_ZN7S1483C42v9Ev");}
void  S1483C4 ::v10(){vfunc_called(this, "_ZN7S1483C43v10Ev");}
void  S1483C4 ::v11(){vfunc_called(this, "_ZN7S1483C43v11Ev");}
void  S1483C4 ::v12(){vfunc_called(this, "_ZN7S1483C43v12Ev");}
void  S1483C4 ::v13(){vfunc_called(this, "_ZN7S1483C43v13Ev");}
void  S1483C4 ::v14(){vfunc_called(this, "_ZN7S1483C43v14Ev");}
S1483C4 ::S1483C4(){ note_ctor("S1483C4", this);} // tgen

static void Test_S1483C4()
{
  extern Class_Descriptor cd_S1483C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1483C4, buf);
    S1483C4 *dp, &lv = *(dp=new (buf) S1483C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1483C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1483C4)");
    check_field_offset(lv, s1483c4f0, ABISELECT(8,4), "S1483C4.s1483c4f0");
    check_field_offset(lv, s1483c4f1, ABISELECT(24,12), "S1483C4.s1483c4f1");
    check_field_offset(lv, s1483c4f2, ABISELECT(48,28), "S1483C4.s1483c4f2");
    test_class_info(&lv, &cd_S1483C4);
    dp->~S1483C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1483C4(Test_S1483C4, "S1483C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1483C4C1Ev();
extern void _ZN7S1483C4D1Ev();
Name_Map name_map_S1483C4[] = {
  NSPAIR(_ZN7S1483C4C1Ev),
  NSPAIR(_ZN7S1483C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1483C4[];
extern void _ZN7S1483C4D1Ev();
extern void _ZN7S1483C4D0Ev();
extern void _ZN7S1483C42v5Ev();
extern void _ZN7S1483C42v6Ev();
extern void _ZN7S1483C42v7Ev();
extern void _ZN7S1483C42v8Ev();
extern void _ZN7S1483C42v9Ev();
extern void _ZN7S1483C43v10Ev();
extern void _ZN7S1483C43v11Ev();
extern void _ZN7S1483C43v12Ev();
extern void _ZN7S1483C43v13Ev();
extern void _ZN7S1483C43v14Ev();
static  VTBL_ENTRY vtc_S1483C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1483C4[0]),
  (VTBL_ENTRY)&_ZN7S1483C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1483C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1483C4[];
extern  VTBL_ENTRY _ZTV7S1483C4[];
Class_Descriptor cd_S1483C4 = {  "S1483C4", // class name
  0,0,//no base classes
  &(vtc_S1483C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1483C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1483C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1483C3  : S1483C4 {
  void *s1483c3f0;
  ::S10103C13_nt s1483c3f1;
  ::S10103C13_nt s1483c3f2;
  ::S10103C13_nt s1483c3f3;
  ::S10103C86 s1483c3f4;
  ::S10103C86 s1483c3f5;
  ::S10103C86 s1483c3f6;
  virtual  ~S1483C3(); // _ZN7S1483C3D1Ev
  virtual void  v15(); // _ZN7S1483C33v15Ev
  virtual void  v16(); // _ZN7S1483C33v16Ev
  virtual void  v17(); // _ZN7S1483C33v17Ev
  virtual void  v18(); // _ZN7S1483C33v18Ev
  virtual void  v19(); // _ZN7S1483C33v19Ev
  S1483C3(); // tgen
};
//SIG(-1 S1483C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1483C3 ::~S1483C3(){ note_dtor("S1483C3", this);}
void  S1483C3 ::v15(){vfunc_called(this, "_ZN7S1483C33v15Ev");}
void  S1483C3 ::v16(){vfunc_called(this, "_ZN7S1483C33v16Ev");}
void  S1483C3 ::v17(){vfunc_called(this, "_ZN7S1483C33v17Ev");}
void  S1483C3 ::v18(){vfunc_called(this, "_ZN7S1483C33v18Ev");}
void  S1483C3 ::v19(){vfunc_called(this, "_ZN7S1483C33v19Ev");}
S1483C3 ::S1483C3(){ note_ctor("S1483C3", this);} // tgen

static void Test_S1483C3()
{
  extern Class_Descriptor cd_S1483C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1483C3, buf);
    S1483C3 *dp, &lv = *(dp=new (buf) S1483C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1483C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1483C3)");
    check_base_class_offset(lv, (S1483C4*), 0, "S1483C3");
    check_field_offset(lv, s1483c3f0, ABISELECT(56,32), "S1483C3.s1483c3f0");
    check_field_offset(lv, s1483c3f1, ABISELECT(64,36), "S1483C3.s1483c3f1");
    check_field_offset(lv, s1483c3f2, ABISELECT(88,52), "S1483C3.s1483c3f2");
    check_field_offset(lv, s1483c3f3, ABISELECT(112,68), "S1483C3.s1483c3f3");
    check_field_offset(lv, s1483c3f4, ABISELECT(136,84), "S1483C3.s1483c3f4");
    check_field_offset(lv, s1483c3f5, ABISELECT(152,96), "S1483C3.s1483c3f5");
    check_field_offset(lv, s1483c3f6, ABISELECT(168,108), "S1483C3.s1483c3f6");
    test_class_info(&lv, &cd_S1483C3);
    dp->~S1483C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1483C3(Test_S1483C3, "S1483C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1483C3C1Ev();
extern void _ZN7S1483C3D1Ev();
Name_Map name_map_S1483C3[] = {
  NSPAIR(_ZN7S1483C3C1Ev),
  NSPAIR(_ZN7S1483C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1483C4;
extern VTBL_ENTRY _ZTI7S1483C4[];
extern  VTBL_ENTRY _ZTV7S1483C4[];
static Base_Class bases_S1483C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1483C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1483C3[];
extern void _ZN7S1483C3D1Ev();
extern void _ZN7S1483C3D0Ev();
extern void _ZN7S1483C42v5Ev();
extern void _ZN7S1483C42v6Ev();
extern void _ZN7S1483C42v7Ev();
extern void _ZN7S1483C42v8Ev();
extern void _ZN7S1483C42v9Ev();
extern void _ZN7S1483C43v10Ev();
extern void _ZN7S1483C43v11Ev();
extern void _ZN7S1483C43v12Ev();
extern void _ZN7S1483C43v13Ev();
extern void _ZN7S1483C43v14Ev();
extern void _ZN7S1483C33v15Ev();
extern void _ZN7S1483C33v16Ev();
extern void _ZN7S1483C33v17Ev();
extern void _ZN7S1483C33v18Ev();
extern void _ZN7S1483C33v19Ev();
static  VTBL_ENTRY vtc_S1483C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1483C3[0]),
  (VTBL_ENTRY)&_ZN7S1483C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1483C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1483C3[];
extern  VTBL_ENTRY _ZTV7S1483C3[];
Class_Descriptor cd_S1483C3 = {  "S1483C3", // class name
  bases_S1483C3, 1,
  &(vtc_S1483C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1483C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1483C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1483C2  : S1483C3 {
  int s1483c2f0;
  ::S10103C82_nt s1483c2f1;
  virtual  ~S1483C2(); // _ZN7S1483C2D1Ev
  virtual void  v20(); // _ZN7S1483C23v20Ev
  virtual void  v21(); // _ZN7S1483C23v21Ev
  virtual void  v22(); // _ZN7S1483C23v22Ev
  virtual void  v23(); // _ZN7S1483C23v23Ev
  S1483C2(); // tgen
};
//SIG(-1 S1483C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 Fi FC10{ m FC11{ m FL[2]}}}


 S1483C2 ::~S1483C2(){ note_dtor("S1483C2", this);}
void  S1483C2 ::v20(){vfunc_called(this, "_ZN7S1483C23v20Ev");}
void  S1483C2 ::v21(){vfunc_called(this, "_ZN7S1483C23v21Ev");}
void  S1483C2 ::v22(){vfunc_called(this, "_ZN7S1483C23v22Ev");}
void  S1483C2 ::v23(){vfunc_called(this, "_ZN7S1483C23v23Ev");}
S1483C2 ::S1483C2(){ note_ctor("S1483C2", this);} // tgen

static void Test_S1483C2()
{
  extern Class_Descriptor cd_S1483C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(27,36)];
    init_test(&cd_S1483C2, buf);
    S1483C2 *dp, &lv = *(dp=new (buf) S1483C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(208,140), "sizeof(S1483C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1483C2)");
    check_base_class_offset(lv, (S1483C4*)(S1483C3*), 0, "S1483C2");
    check_base_class_offset(lv, (S1483C3*), 0, "S1483C2");
    check_field_offset(lv, s1483c2f0, ABISELECT(184,120), "S1483C2.s1483c2f0");
    check_field_offset(lv, s1483c2f1, ABISELECT(192,124), "S1483C2.s1483c2f1");
    test_class_info(&lv, &cd_S1483C2);
    dp->~S1483C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1483C2(Test_S1483C2, "S1483C2", ABISELECT(208,140));

#else // __cplusplus

extern void _ZN7S1483C2C1Ev();
extern void _ZN7S1483C2D1Ev();
Name_Map name_map_S1483C2[] = {
  NSPAIR(_ZN7S1483C2C1Ev),
  NSPAIR(_ZN7S1483C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1483C4;
extern VTBL_ENTRY _ZTI7S1483C4[];
extern  VTBL_ENTRY _ZTV7S1483C4[];
extern Class_Descriptor cd_S1483C3;
extern VTBL_ENTRY _ZTI7S1483C3[];
extern  VTBL_ENTRY _ZTV7S1483C3[];
static Base_Class bases_S1483C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1483C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1483C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1483C2[];
extern void _ZN7S1483C2D1Ev();
extern void _ZN7S1483C2D0Ev();
extern void _ZN7S1483C42v5Ev();
extern void _ZN7S1483C42v6Ev();
extern void _ZN7S1483C42v7Ev();
extern void _ZN7S1483C42v8Ev();
extern void _ZN7S1483C42v9Ev();
extern void _ZN7S1483C43v10Ev();
extern void _ZN7S1483C43v11Ev();
extern void _ZN7S1483C43v12Ev();
extern void _ZN7S1483C43v13Ev();
extern void _ZN7S1483C43v14Ev();
extern void _ZN7S1483C33v15Ev();
extern void _ZN7S1483C33v16Ev();
extern void _ZN7S1483C33v17Ev();
extern void _ZN7S1483C33v18Ev();
extern void _ZN7S1483C33v19Ev();
extern void _ZN7S1483C23v20Ev();
extern void _ZN7S1483C23v21Ev();
extern void _ZN7S1483C23v22Ev();
extern void _ZN7S1483C23v23Ev();
static  VTBL_ENTRY vtc_S1483C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1483C2[0]),
  (VTBL_ENTRY)&_ZN7S1483C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1483C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1483C2[];
extern  VTBL_ENTRY _ZTV7S1483C2[];
Class_Descriptor cd_S1483C2 = {  "S1483C2", // class name
  bases_S1483C2, 2,
  &(vtc_S1483C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(208,140), // object size
  NSPAIRA(_ZTI7S1483C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1483C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1483C1  : S1483C2 {
  int s1483c1f0;
  virtual  ~S1483C1(); // _ZN7S1483C1D1Ev
  virtual void  v1(); // _ZN7S1483C12v1Ev
  virtual void  v2(); // _ZN7S1483C12v2Ev
  virtual void  v3(); // _ZN7S1483C12v3Ev
  virtual void  v4(); // _ZN7S1483C12v4Ev
  S1483C1(); // tgen
};
//SIG(1 S1483C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} vd v20 v21 v22 v23 Fi FC11{ m FC12{ m FL[2]}}} vd v1 v2 v3 v4 Fi}


 S1483C1 ::~S1483C1(){ note_dtor("S1483C1", this);}
void  S1483C1 ::v1(){vfunc_called(this, "_ZN7S1483C12v1Ev");}
void  S1483C1 ::v2(){vfunc_called(this, "_ZN7S1483C12v2Ev");}
void  S1483C1 ::v3(){vfunc_called(this, "_ZN7S1483C12v3Ev");}
void  S1483C1 ::v4(){vfunc_called(this, "_ZN7S1483C12v4Ev");}
S1483C1 ::S1483C1(){ note_ctor("S1483C1", this);} // tgen

static void Test_S1483C1()
{
  extern Class_Descriptor cd_S1483C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,37)];
    init_test(&cd_S1483C1, buf);
    S1483C1 *dp, &lv = *(dp=new (buf) S1483C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,144), "sizeof(S1483C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1483C1)");
    check_base_class_offset(lv, (S1483C4*)(S1483C3*)(S1483C2*), 0, "S1483C1");
    check_base_class_offset(lv, (S1483C3*)(S1483C2*), 0, "S1483C1");
    check_base_class_offset(lv, (S1483C2*), 0, "S1483C1");
    check_field_offset(lv, s1483c1f0, ABISELECT(208,140), "S1483C1.s1483c1f0");
    test_class_info(&lv, &cd_S1483C1);
    dp->~S1483C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1483C1(Test_S1483C1, "S1483C1", ABISELECT(216,144));

#else // __cplusplus

extern void _ZN7S1483C1C1Ev();
extern void _ZN7S1483C1D1Ev();
Name_Map name_map_S1483C1[] = {
  NSPAIR(_ZN7S1483C1C1Ev),
  NSPAIR(_ZN7S1483C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1483C4;
extern VTBL_ENTRY _ZTI7S1483C4[];
extern  VTBL_ENTRY _ZTV7S1483C4[];
extern Class_Descriptor cd_S1483C3;
extern VTBL_ENTRY _ZTI7S1483C3[];
extern  VTBL_ENTRY _ZTV7S1483C3[];
extern Class_Descriptor cd_S1483C2;
extern VTBL_ENTRY _ZTI7S1483C2[];
extern  VTBL_ENTRY _ZTV7S1483C2[];
static Base_Class bases_S1483C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1483C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1483C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1483C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1483C1[];
extern void _ZN7S1483C1D1Ev();
extern void _ZN7S1483C1D0Ev();
extern void _ZN7S1483C42v5Ev();
extern void _ZN7S1483C42v6Ev();
extern void _ZN7S1483C42v7Ev();
extern void _ZN7S1483C42v8Ev();
extern void _ZN7S1483C42v9Ev();
extern void _ZN7S1483C43v10Ev();
extern void _ZN7S1483C43v11Ev();
extern void _ZN7S1483C43v12Ev();
extern void _ZN7S1483C43v13Ev();
extern void _ZN7S1483C43v14Ev();
extern void _ZN7S1483C33v15Ev();
extern void _ZN7S1483C33v16Ev();
extern void _ZN7S1483C33v17Ev();
extern void _ZN7S1483C33v18Ev();
extern void _ZN7S1483C33v19Ev();
extern void _ZN7S1483C23v20Ev();
extern void _ZN7S1483C23v21Ev();
extern void _ZN7S1483C23v22Ev();
extern void _ZN7S1483C23v23Ev();
extern void _ZN7S1483C12v1Ev();
extern void _ZN7S1483C12v2Ev();
extern void _ZN7S1483C12v3Ev();
extern void _ZN7S1483C12v4Ev();
static  VTBL_ENTRY vtc_S1483C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1483C1[0]),
  (VTBL_ENTRY)&_ZN7S1483C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1483C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1483C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1483C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1483C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1483C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1483C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1483C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1483C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1483C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1483C1[];
extern  VTBL_ENTRY _ZTV7S1483C1[];
Class_Descriptor cd_S1483C1 = {  "S1483C1", // class name
  bases_S1483C1, 3,
  &(vtc_S1483C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,144), // object size
  NSPAIRA(_ZTI7S1483C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1483C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S646C5  {
  void *s646c5f0[2];
  ::S10103C13_nt s646c5f1;
  void *s646c5f2;
  virtual  ~S646C5(); // _ZN6S646C5D1Ev
  virtual void  v5(); // _ZN6S646C52v5Ev
  virtual void  v6(); // _ZN6S646C52v6Ev
  virtual void  v7(); // _ZN6S646C52v7Ev
  virtual void  v8(); // _ZN6S646C52v8Ev
  virtual void  v9(); // _ZN6S646C52v9Ev
  virtual void  v10(); // _ZN6S646C53v10Ev
  virtual void  v11(); // _ZN6S646C53v11Ev
  virtual void  v12(); // _ZN6S646C53v12Ev
  virtual void  v13(); // _ZN6S646C53v13Ev
  virtual void  v14(); // _ZN6S646C53v14Ev
  S646C5(); // tgen
};
//SIG(-1 S646C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S646C5 ::~S646C5(){ note_dtor("S646C5", this);}
void  S646C5 ::v5(){vfunc_called(this, "_ZN6S646C52v5Ev");}
void  S646C5 ::v6(){vfunc_called(this, "_ZN6S646C52v6Ev");}
void  S646C5 ::v7(){vfunc_called(this, "_ZN6S646C52v7Ev");}
void  S646C5 ::v8(){vfunc_called(this, "_ZN6S646C52v8Ev");}
void  S646C5 ::v9(){vfunc_called(this, "_ZN6S646C52v9Ev");}
void  S646C5 ::v10(){vfunc_called(this, "_ZN6S646C53v10Ev");}
void  S646C5 ::v11(){vfunc_called(this, "_ZN6S646C53v11Ev");}
void  S646C5 ::v12(){vfunc_called(this, "_ZN6S646C53v12Ev");}
void  S646C5 ::v13(){vfunc_called(this, "_ZN6S646C53v13Ev");}
void  S646C5 ::v14(){vfunc_called(this, "_ZN6S646C53v14Ev");}
S646C5 ::S646C5(){ note_ctor("S646C5", this);} // tgen

static void Test_S646C5()
{
  extern Class_Descriptor cd_S646C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S646C5, buf);
    S646C5 *dp, &lv = *(dp=new (buf) S646C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S646C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S646C5)");
    check_field_offset(lv, s646c5f0, ABISELECT(8,4), "S646C5.s646c5f0");
    check_field_offset(lv, s646c5f1, ABISELECT(24,12), "S646C5.s646c5f1");
    check_field_offset(lv, s646c5f2, ABISELECT(48,28), "S646C5.s646c5f2");
    test_class_info(&lv, &cd_S646C5);
    dp->~S646C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS646C5(Test_S646C5, "S646C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S646C5C1Ev();
extern void _ZN6S646C5D1Ev();
Name_Map name_map_S646C5[] = {
  NSPAIR(_ZN6S646C5C1Ev),
  NSPAIR(_ZN6S646C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S646C5[];
extern void _ZN6S646C5D1Ev();
extern void _ZN6S646C5D0Ev();
extern void _ZN6S646C52v5Ev();
extern void _ZN6S646C52v6Ev();
extern void _ZN6S646C52v7Ev();
extern void _ZN6S646C52v8Ev();
extern void _ZN6S646C52v9Ev();
extern void _ZN6S646C53v10Ev();
extern void _ZN6S646C53v11Ev();
extern void _ZN6S646C53v12Ev();
extern void _ZN6S646C53v13Ev();
extern void _ZN6S646C53v14Ev();
static  VTBL_ENTRY vtc_S646C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S646C5[0]),
  (VTBL_ENTRY)&_ZN6S646C5D1Ev,
  (VTBL_ENTRY)&_ZN6S646C5D0Ev,
  (VTBL_ENTRY)&_ZN6S646C52v5Ev,
  (VTBL_ENTRY)&_ZN6S646C52v6Ev,
  (VTBL_ENTRY)&_ZN6S646C52v7Ev,
  (VTBL_ENTRY)&_ZN6S646C52v8Ev,
  (VTBL_ENTRY)&_ZN6S646C52v9Ev,
  (VTBL_ENTRY)&_ZN6S646C53v10Ev,
  (VTBL_ENTRY)&_ZN6S646C53v11Ev,
  (VTBL_ENTRY)&_ZN6S646C53v12Ev,
  (VTBL_ENTRY)&_ZN6S646C53v13Ev,
  (VTBL_ENTRY)&_ZN6S646C53v14Ev,
};
extern VTBL_ENTRY _ZTI6S646C5[];
extern  VTBL_ENTRY _ZTV6S646C5[];
Class_Descriptor cd_S646C5 = {  "S646C5", // class name
  0,0,//no base classes
  &(vtc_S646C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S646C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S646C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S646C4  : S646C5 {
  void *s646c4f0;
  ::S10103C13_nt s646c4f1;
  ::S10103C13_nt s646c4f2;
  ::S10103C13_nt s646c4f3;
  ::S10103C86 s646c4f4;
  ::S10103C86 s646c4f5;
  ::S10103C86 s646c4f6;
  virtual  ~S646C4(); // _ZN6S646C4D1Ev
  virtual void  v15(); // _ZN6S646C43v15Ev
  virtual void  v16(); // _ZN6S646C43v16Ev
  virtual void  v17(); // _ZN6S646C43v17Ev
  virtual void  v18(); // _ZN6S646C43v18Ev
  virtual void  v19(); // _ZN6S646C43v19Ev
  S646C4(); // tgen
};
//SIG(-1 S646C4) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S646C4 ::~S646C4(){ note_dtor("S646C4", this);}
void  S646C4 ::v15(){vfunc_called(this, "_ZN6S646C43v15Ev");}
void  S646C4 ::v16(){vfunc_called(this, "_ZN6S646C43v16Ev");}
void  S646C4 ::v17(){vfunc_called(this, "_ZN6S646C43v17Ev");}
void  S646C4 ::v18(){vfunc_called(this, "_ZN6S646C43v18Ev");}
void  S646C4 ::v19(){vfunc_called(this, "_ZN6S646C43v19Ev");}
S646C4 ::S646C4(){ note_ctor("S646C4", this);} // tgen

static void Test_S646C4()
{
  extern Class_Descriptor cd_S646C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S646C4, buf);
    S646C4 *dp, &lv = *(dp=new (buf) S646C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S646C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S646C4)");
    check_base_class_offset(lv, (S646C5*), 0, "S646C4");
    check_field_offset(lv, s646c4f0, ABISELECT(56,32), "S646C4.s646c4f0");
    check_field_offset(lv, s646c4f1, ABISELECT(64,36), "S646C4.s646c4f1");
    check_field_offset(lv, s646c4f2, ABISELECT(88,52), "S646C4.s646c4f2");
    check_field_offset(lv, s646c4f3, ABISELECT(112,68), "S646C4.s646c4f3");
    check_field_offset(lv, s646c4f4, ABISELECT(136,84), "S646C4.s646c4f4");
    check_field_offset(lv, s646c4f5, ABISELECT(152,96), "S646C4.s646c4f5");
    check_field_offset(lv, s646c4f6, ABISELECT(168,108), "S646C4.s646c4f6");
    test_class_info(&lv, &cd_S646C4);
    dp->~S646C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS646C4(Test_S646C4, "S646C4", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN6S646C4C1Ev();
extern void _ZN6S646C4D1Ev();
Name_Map name_map_S646C4[] = {
  NSPAIR(_ZN6S646C4C1Ev),
  NSPAIR(_ZN6S646C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S646C5;
extern VTBL_ENTRY _ZTI6S646C5[];
extern  VTBL_ENTRY _ZTV6S646C5[];
static Base_Class bases_S646C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S646C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S646C4[];
extern void _ZN6S646C4D1Ev();
extern void _ZN6S646C4D0Ev();
extern void _ZN6S646C52v5Ev();
extern void _ZN6S646C52v6Ev();
extern void _ZN6S646C52v7Ev();
extern void _ZN6S646C52v8Ev();
extern void _ZN6S646C52v9Ev();
extern void _ZN6S646C53v10Ev();
extern void _ZN6S646C53v11Ev();
extern void _ZN6S646C53v12Ev();
extern void _ZN6S646C53v13Ev();
extern void _ZN6S646C53v14Ev();
extern void _ZN6S646C43v15Ev();
extern void _ZN6S646C43v16Ev();
extern void _ZN6S646C43v17Ev();
extern void _ZN6S646C43v18Ev();
extern void _ZN6S646C43v19Ev();
static  VTBL_ENTRY vtc_S646C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S646C4[0]),
  (VTBL_ENTRY)&_ZN6S646C4D1Ev,
  (VTBL_ENTRY)&_ZN6S646C4D0Ev,
  (VTBL_ENTRY)&_ZN6S646C52v5Ev,
  (VTBL_ENTRY)&_ZN6S646C52v6Ev,
  (VTBL_ENTRY)&_ZN6S646C52v7Ev,
  (VTBL_ENTRY)&_ZN6S646C52v8Ev,
  (VTBL_ENTRY)&_ZN6S646C52v9Ev,
  (VTBL_ENTRY)&_ZN6S646C53v10Ev,
  (VTBL_ENTRY)&_ZN6S646C53v11Ev,
  (VTBL_ENTRY)&_ZN6S646C53v12Ev,
  (VTBL_ENTRY)&_ZN6S646C53v13Ev,
  (VTBL_ENTRY)&_ZN6S646C53v14Ev,
  (VTBL_ENTRY)&_ZN6S646C43v15Ev,
  (VTBL_ENTRY)&_ZN6S646C43v16Ev,
  (VTBL_ENTRY)&_ZN6S646C43v17Ev,
  (VTBL_ENTRY)&_ZN6S646C43v18Ev,
  (VTBL_ENTRY)&_ZN6S646C43v19Ev,
};
extern VTBL_ENTRY _ZTI6S646C4[];
extern  VTBL_ENTRY _ZTV6S646C4[];
Class_Descriptor cd_S646C4 = {  "S646C4", // class name
  bases_S646C4, 1,
  &(vtc_S646C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI6S646C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S646C4),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S646C3  : S646C4 {
  char s646c3f0;
  virtual void  v20(); // _ZN6S646C33v20Ev
  virtual void  v21(); // _ZN6S646C33v21Ev
  virtual void  v22(); // _ZN6S646C33v22Ev
  virtual void  v23(); // _ZN6S646C33v23Ev
  ~S646C3(); // tgen
  S646C3(); // tgen
};
//SIG(-1 S646C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S646C3 ::v20(){vfunc_called(this, "_ZN6S646C33v20Ev");}
void  S646C3 ::v21(){vfunc_called(this, "_ZN6S646C33v21Ev");}
void  S646C3 ::v22(){vfunc_called(this, "_ZN6S646C33v22Ev");}
void  S646C3 ::v23(){vfunc_called(this, "_ZN6S646C33v23Ev");}
S646C3 ::~S646C3(){ note_dtor("S646C3", this);} // tgen
S646C3 ::S646C3(){ note_ctor("S646C3", this);} // tgen

static void Test_S646C3()
{
  extern Class_Descriptor cd_S646C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S646C3, buf);
    S646C3 *dp, &lv = *(dp=new (buf) S646C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S646C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S646C3)");
    check_base_class_offset(lv, (S646C5*)(S646C4*), 0, "S646C3");
    check_base_class_offset(lv, (S646C4*), 0, "S646C3");
    check_field_offset(lv, s646c3f0, ABISELECT(184,120), "S646C3.s646c3f0");
    test_class_info(&lv, &cd_S646C3);
    dp->~S646C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS646C3(Test_S646C3, "S646C3", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN6S646C3C1Ev();
extern void _ZN6S646C3D1Ev();
Name_Map name_map_S646C3[] = {
  NSPAIR(_ZN6S646C3C1Ev),
  NSPAIR(_ZN6S646C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S646C5;
extern VTBL_ENTRY _ZTI6S646C5[];
extern  VTBL_ENTRY _ZTV6S646C5[];
extern Class_Descriptor cd_S646C4;
extern VTBL_ENTRY _ZTI6S646C4[];
extern  VTBL_ENTRY _ZTV6S646C4[];
static Base_Class bases_S646C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S646C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S646C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S646C3[];
extern void _ZN6S646C3D1Ev();
extern void _ZN6S646C3D0Ev();
extern void _ZN6S646C52v5Ev();
extern void _ZN6S646C52v6Ev();
extern void _ZN6S646C52v7Ev();
extern void _ZN6S646C52v8Ev();
extern void _ZN6S646C52v9Ev();
extern void _ZN6S646C53v10Ev();
extern void _ZN6S646C53v11Ev();
extern void _ZN6S646C53v12Ev();
extern void _ZN6S646C53v13Ev();
extern void _ZN6S646C53v14Ev();
extern void _ZN6S646C43v15Ev();
extern void _ZN6S646C43v16Ev();
extern void _ZN6S646C43v17Ev();
extern void _ZN6S646C43v18Ev();
extern void _ZN6S646C43v19Ev();
extern void _ZN6S646C33v20Ev();
extern void _ZN6S646C33v21Ev();
extern void _ZN6S646C33v22Ev();
extern void _ZN6S646C33v23Ev();
static  VTBL_ENTRY vtc_S646C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S646C3[0]),
  (VTBL_ENTRY)&_ZN6S646C3D1Ev,
  (VTBL_ENTRY)&_ZN6S646C3D0Ev,
  (VTBL_ENTRY)&_ZN6S646C52v5Ev,
  (VTBL_ENTRY)&_ZN6S646C52v6Ev,
  (VTBL_ENTRY)&_ZN6S646C52v7Ev,
  (VTBL_ENTRY)&_ZN6S646C52v8Ev,
  (VTBL_ENTRY)&_ZN6S646C52v9Ev,
  (VTBL_ENTRY)&_ZN6S646C53v10Ev,
  (VTBL_ENTRY)&_ZN6S646C53v11Ev,
  (VTBL_ENTRY)&_ZN6S646C53v12Ev,
  (VTBL_ENTRY)&_ZN6S646C53v13Ev,
  (VTBL_ENTRY)&_ZN6S646C53v14Ev,
  (VTBL_ENTRY)&_ZN6S646C43v15Ev,
  (VTBL_ENTRY)&_ZN6S646C43v16Ev,
  (VTBL_ENTRY)&_ZN6S646C43v17Ev,
  (VTBL_ENTRY)&_ZN6S646C43v18Ev,
  (VTBL_ENTRY)&_ZN6S646C43v19Ev,
  (VTBL_ENTRY)&_ZN6S646C33v20Ev,
  (VTBL_ENTRY)&_ZN6S646C33v21Ev,
  (VTBL_ENTRY)&_ZN6S646C33v22Ev,
  (VTBL_ENTRY)&_ZN6S646C33v23Ev,
};
extern VTBL_ENTRY _ZTI6S646C3[];
extern  VTBL_ENTRY _ZTV6S646C3[];
Class_Descriptor cd_S646C3 = {  "S646C3", // class name
  bases_S646C3, 2,
  &(vtc_S646C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI6S646C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S646C3),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S646C2  : S646C3 {
  char s646c2f0;
  int s646c2f1;
  virtual void  v24(); // _ZN6S646C23v24Ev
  virtual void  v25(); // _ZN6S646C23v25Ev
  virtual void  v26(); // _ZN6S646C23v26Ev
  virtual void  v27(); // _ZN6S646C23v27Ev
  ~S646C2(); // tgen
  S646C2(); // tgen
};
//SIG(-1 S646C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fc} v1 v2 v3 v4 Fc Fi}


void  S646C2 ::v24(){vfunc_called(this, "_ZN6S646C23v24Ev");}
void  S646C2 ::v25(){vfunc_called(this, "_ZN6S646C23v25Ev");}
void  S646C2 ::v26(){vfunc_called(this, "_ZN6S646C23v26Ev");}
void  S646C2 ::v27(){vfunc_called(this, "_ZN6S646C23v27Ev");}
S646C2 ::~S646C2(){ note_dtor("S646C2", this);} // tgen
S646C2 ::S646C2(){ note_ctor("S646C2", this);} // tgen

static void Test_S646C2()
{
  extern Class_Descriptor cd_S646C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S646C2, buf);
    S646C2 *dp, &lv = *(dp=new (buf) S646C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S646C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S646C2)");
    check_base_class_offset(lv, (S646C5*)(S646C4*)(S646C3*), 0, "S646C2");
    check_base_class_offset(lv, (S646C4*)(S646C3*), 0, "S646C2");
    check_base_class_offset(lv, (S646C3*), 0, "S646C2");
    check_field_offset(lv, s646c2f0, ABISELECT(185,121), "S646C2.s646c2f0");
    check_field_offset(lv, s646c2f1, ABISELECT(188,124), "S646C2.s646c2f1");
    test_class_info(&lv, &cd_S646C2);
    dp->~S646C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS646C2(Test_S646C2, "S646C2", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN6S646C2C1Ev();
extern void _ZN6S646C2D1Ev();
Name_Map name_map_S646C2[] = {
  NSPAIR(_ZN6S646C2C1Ev),
  NSPAIR(_ZN6S646C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S646C5;
extern VTBL_ENTRY _ZTI6S646C5[];
extern  VTBL_ENTRY _ZTV6S646C5[];
extern Class_Descriptor cd_S646C4;
extern VTBL_ENTRY _ZTI6S646C4[];
extern  VTBL_ENTRY _ZTV6S646C4[];
extern Class_Descriptor cd_S646C3;
extern VTBL_ENTRY _ZTI6S646C3[];
extern  VTBL_ENTRY _ZTV6S646C3[];
static Base_Class bases_S646C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S646C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S646C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S646C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S646C2[];
extern void _ZN6S646C2D1Ev();
extern void _ZN6S646C2D0Ev();
extern void _ZN6S646C52v5Ev();
extern void _ZN6S646C52v6Ev();
extern void _ZN6S646C52v7Ev();
extern void _ZN6S646C52v8Ev();
extern void _ZN6S646C52v9Ev();
extern void _ZN6S646C53v10Ev();
extern void _ZN6S646C53v11Ev();
extern void _ZN6S646C53v12Ev();
extern void _ZN6S646C53v13Ev();
extern void _ZN6S646C53v14Ev();
extern void _ZN6S646C43v15Ev();
extern void _ZN6S646C43v16Ev();
extern void _ZN6S646C43v17Ev();
extern void _ZN6S646C43v18Ev();
extern void _ZN6S646C43v19Ev();
extern void _ZN6S646C33v20Ev();
extern void _ZN6S646C33v21Ev();
extern void _ZN6S646C33v22Ev();
extern void _ZN6S646C33v23Ev();
extern void _ZN6S646C23v24Ev();
extern void _ZN6S646C23v25Ev();
extern void _ZN6S646C23v26Ev();
extern void _ZN6S646C23v27Ev();
static  VTBL_ENTRY vtc_S646C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S646C2[0]),
  (VTBL_ENTRY)&_ZN6S646C2D1Ev,
  (VTBL_ENTRY)&_ZN6S646C2D0Ev,
  (VTBL_ENTRY)&_ZN6S646C52v5Ev,
  (VTBL_ENTRY)&_ZN6S646C52v6Ev,
  (VTBL_ENTRY)&_ZN6S646C52v7Ev,
  (VTBL_ENTRY)&_ZN6S646C52v8Ev,
  (VTBL_ENTRY)&_ZN6S646C52v9Ev,
  (VTBL_ENTRY)&_ZN6S646C53v10Ev,
  (VTBL_ENTRY)&_ZN6S646C53v11Ev,
  (VTBL_ENTRY)&_ZN6S646C53v12Ev,
  (VTBL_ENTRY)&_ZN6S646C53v13Ev,
  (VTBL_ENTRY)&_ZN6S646C53v14Ev,
  (VTBL_ENTRY)&_ZN6S646C43v15Ev,
  (VTBL_ENTRY)&_ZN6S646C43v16Ev,
  (VTBL_ENTRY)&_ZN6S646C43v17Ev,
  (VTBL_ENTRY)&_ZN6S646C43v18Ev,
  (VTBL_ENTRY)&_ZN6S646C43v19Ev,
  (VTBL_ENTRY)&_ZN6S646C33v20Ev,
  (VTBL_ENTRY)&_ZN6S646C33v21Ev,
  (VTBL_ENTRY)&_ZN6S646C33v22Ev,
  (VTBL_ENTRY)&_ZN6S646C33v23Ev,
  (VTBL_ENTRY)&_ZN6S646C23v24Ev,
  (VTBL_ENTRY)&_ZN6S646C23v25Ev,
  (VTBL_ENTRY)&_ZN6S646C23v26Ev,
  (VTBL_ENTRY)&_ZN6S646C23v27Ev,
};
extern VTBL_ENTRY _ZTI6S646C2[];
extern  VTBL_ENTRY _ZTV6S646C2[];
Class_Descriptor cd_S646C2 = {  "S646C2", // class name
  bases_S646C2, 3,
  &(vtc_S646C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI6S646C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S646C2),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S646C1  : S646C2 {
  virtual  ~S646C1(); // _ZN6S646C1D1Ev
  virtual void  v1(); // _ZN6S646C12v1Ev
  virtual void  v2(); // _ZN6S646C12v2Ev
  virtual void  v3(); // _ZN6S646C12v3Ev
  virtual void  v4(); // _ZN6S646C12v4Ev
  S646C1(); // tgen
};
//SIG(1 S646C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC6 FC6 FC6 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC9 FC9} v20 v21 v22 v23 Fc} v24 v25 v26 v27 Fc Fi} vd v1 v2 v3 v4}


 S646C1 ::~S646C1(){ note_dtor("S646C1", this);}
void  S646C1 ::v1(){vfunc_called(this, "_ZN6S646C12v1Ev");}
void  S646C1 ::v2(){vfunc_called(this, "_ZN6S646C12v2Ev");}
void  S646C1 ::v3(){vfunc_called(this, "_ZN6S646C12v3Ev");}
void  S646C1 ::v4(){vfunc_called(this, "_ZN6S646C12v4Ev");}
S646C1 ::S646C1(){ note_ctor("S646C1", this);} // tgen

static void Test_S646C1()
{
  extern Class_Descriptor cd_S646C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S646C1, buf);
    S646C1 *dp, &lv = *(dp=new (buf) S646C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S646C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S646C1)");
    check_base_class_offset(lv, (S646C5*)(S646C4*)(S646C3*)(S646C2*), 0, "S646C1");
    check_base_class_offset(lv, (S646C4*)(S646C3*)(S646C2*), 0, "S646C1");
    check_base_class_offset(lv, (S646C3*)(S646C2*), 0, "S646C1");
    check_base_class_offset(lv, (S646C2*), 0, "S646C1");
    test_class_info(&lv, &cd_S646C1);
    dp->~S646C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS646C1(Test_S646C1, "S646C1", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN6S646C1C1Ev();
extern void _ZN6S646C1D1Ev();
Name_Map name_map_S646C1[] = {
  NSPAIR(_ZN6S646C1C1Ev),
  NSPAIR(_ZN6S646C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S646C5;
extern VTBL_ENTRY _ZTI6S646C5[];
extern  VTBL_ENTRY _ZTV6S646C5[];
extern Class_Descriptor cd_S646C4;
extern VTBL_ENTRY _ZTI6S646C4[];
extern  VTBL_ENTRY _ZTV6S646C4[];
extern Class_Descriptor cd_S646C3;
extern VTBL_ENTRY _ZTI6S646C3[];
extern  VTBL_ENTRY _ZTV6S646C3[];
extern Class_Descriptor cd_S646C2;
extern VTBL_ENTRY _ZTI6S646C2[];
extern  VTBL_ENTRY _ZTV6S646C2[];
static Base_Class bases_S646C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S646C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S646C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S646C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S646C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S646C1[];
extern void _ZN6S646C1D1Ev();
extern void _ZN6S646C1D0Ev();
extern void _ZN6S646C52v5Ev();
extern void _ZN6S646C52v6Ev();
extern void _ZN6S646C52v7Ev();
extern void _ZN6S646C52v8Ev();
extern void _ZN6S646C52v9Ev();
extern void _ZN6S646C53v10Ev();
extern void _ZN6S646C53v11Ev();
extern void _ZN6S646C53v12Ev();
extern void _ZN6S646C53v13Ev();
extern void _ZN6S646C53v14Ev();
extern void _ZN6S646C43v15Ev();
extern void _ZN6S646C43v16Ev();
extern void _ZN6S646C43v17Ev();
extern void _ZN6S646C43v18Ev();
extern void _ZN6S646C43v19Ev();
extern void _ZN6S646C33v20Ev();
extern void _ZN6S646C33v21Ev();
extern void _ZN6S646C33v22Ev();
extern void _ZN6S646C33v23Ev();
extern void _ZN6S646C23v24Ev();
extern void _ZN6S646C23v25Ev();
extern void _ZN6S646C23v26Ev();
extern void _ZN6S646C23v27Ev();
extern void _ZN6S646C12v1Ev();
extern void _ZN6S646C12v2Ev();
extern void _ZN6S646C12v3Ev();
extern void _ZN6S646C12v4Ev();
static  VTBL_ENTRY vtc_S646C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S646C1[0]),
  (VTBL_ENTRY)&_ZN6S646C1D1Ev,
  (VTBL_ENTRY)&_ZN6S646C1D0Ev,
  (VTBL_ENTRY)&_ZN6S646C52v5Ev,
  (VTBL_ENTRY)&_ZN6S646C52v6Ev,
  (VTBL_ENTRY)&_ZN6S646C52v7Ev,
  (VTBL_ENTRY)&_ZN6S646C52v8Ev,
  (VTBL_ENTRY)&_ZN6S646C52v9Ev,
  (VTBL_ENTRY)&_ZN6S646C53v10Ev,
  (VTBL_ENTRY)&_ZN6S646C53v11Ev,
  (VTBL_ENTRY)&_ZN6S646C53v12Ev,
  (VTBL_ENTRY)&_ZN6S646C53v13Ev,
  (VTBL_ENTRY)&_ZN6S646C53v14Ev,
  (VTBL_ENTRY)&_ZN6S646C43v15Ev,
  (VTBL_ENTRY)&_ZN6S646C43v16Ev,
  (VTBL_ENTRY)&_ZN6S646C43v17Ev,
  (VTBL_ENTRY)&_ZN6S646C43v18Ev,
  (VTBL_ENTRY)&_ZN6S646C43v19Ev,
  (VTBL_ENTRY)&_ZN6S646C33v20Ev,
  (VTBL_ENTRY)&_ZN6S646C33v21Ev,
  (VTBL_ENTRY)&_ZN6S646C33v22Ev,
  (VTBL_ENTRY)&_ZN6S646C33v23Ev,
  (VTBL_ENTRY)&_ZN6S646C23v24Ev,
  (VTBL_ENTRY)&_ZN6S646C23v25Ev,
  (VTBL_ENTRY)&_ZN6S646C23v26Ev,
  (VTBL_ENTRY)&_ZN6S646C23v27Ev,
  (VTBL_ENTRY)&_ZN6S646C12v1Ev,
  (VTBL_ENTRY)&_ZN6S646C12v2Ev,
  (VTBL_ENTRY)&_ZN6S646C12v3Ev,
  (VTBL_ENTRY)&_ZN6S646C12v4Ev,
};
extern VTBL_ENTRY _ZTI6S646C1[];
extern  VTBL_ENTRY _ZTV6S646C1[];
Class_Descriptor cd_S646C1 = {  "S646C1", // class name
  bases_S646C1, 4,
  &(vtc_S646C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI6S646C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S646C1),31, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3320C3  {
  void *s3320c3f0[2];
  ::S10103C13_nt s3320c3f1;
  void *s3320c3f2;
  virtual  ~S3320C3(); // _ZN7S3320C3D1Ev
  virtual void  v5(); // _ZN7S3320C32v5Ev
  virtual void  v6(); // _ZN7S3320C32v6Ev
  virtual void  v7(); // _ZN7S3320C32v7Ev
  virtual void  v8(); // _ZN7S3320C32v8Ev
  virtual void  v9(); // _ZN7S3320C32v9Ev
  virtual void  v10(); // _ZN7S3320C33v10Ev
  virtual void  v11(); // _ZN7S3320C33v11Ev
  virtual void  v12(); // _ZN7S3320C33v12Ev
  virtual void  v13(); // _ZN7S3320C33v13Ev
  virtual void  v14(); // _ZN7S3320C33v14Ev
  S3320C3(); // tgen
};
//SIG(-1 S3320C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3320C3 ::~S3320C3(){ note_dtor("S3320C3", this);}
void  S3320C3 ::v5(){vfunc_called(this, "_ZN7S3320C32v5Ev");}
void  S3320C3 ::v6(){vfunc_called(this, "_ZN7S3320C32v6Ev");}
void  S3320C3 ::v7(){vfunc_called(this, "_ZN7S3320C32v7Ev");}
void  S3320C3 ::v8(){vfunc_called(this, "_ZN7S3320C32v8Ev");}
void  S3320C3 ::v9(){vfunc_called(this, "_ZN7S3320C32v9Ev");}
void  S3320C3 ::v10(){vfunc_called(this, "_ZN7S3320C33v10Ev");}
void  S3320C3 ::v11(){vfunc_called(this, "_ZN7S3320C33v11Ev");}
void  S3320C3 ::v12(){vfunc_called(this, "_ZN7S3320C33v12Ev");}
void  S3320C3 ::v13(){vfunc_called(this, "_ZN7S3320C33v13Ev");}
void  S3320C3 ::v14(){vfunc_called(this, "_ZN7S3320C33v14Ev");}
S3320C3 ::S3320C3(){ note_ctor("S3320C3", this);} // tgen

static void Test_S3320C3()
{
  extern Class_Descriptor cd_S3320C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3320C3, buf);
    S3320C3 *dp, &lv = *(dp=new (buf) S3320C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3320C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3320C3)");
    check_field_offset(lv, s3320c3f0, ABISELECT(8,4), "S3320C3.s3320c3f0");
    check_field_offset(lv, s3320c3f1, ABISELECT(24,12), "S3320C3.s3320c3f1");
    check_field_offset(lv, s3320c3f2, ABISELECT(48,28), "S3320C3.s3320c3f2");
    test_class_info(&lv, &cd_S3320C3);
    dp->~S3320C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3320C3(Test_S3320C3, "S3320C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3320C3C1Ev();
extern void _ZN7S3320C3D1Ev();
Name_Map name_map_S3320C3[] = {
  NSPAIR(_ZN7S3320C3C1Ev),
  NSPAIR(_ZN7S3320C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3320C3[];
extern void _ZN7S3320C3D1Ev();
extern void _ZN7S3320C3D0Ev();
extern void _ZN7S3320C32v5Ev();
extern void _ZN7S3320C32v6Ev();
extern void _ZN7S3320C32v7Ev();
extern void _ZN7S3320C32v8Ev();
extern void _ZN7S3320C32v9Ev();
extern void _ZN7S3320C33v10Ev();
extern void _ZN7S3320C33v11Ev();
extern void _ZN7S3320C33v12Ev();
extern void _ZN7S3320C33v13Ev();
extern void _ZN7S3320C33v14Ev();
static  VTBL_ENTRY vtc_S3320C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3320C3[0]),
  (VTBL_ENTRY)&_ZN7S3320C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3320C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3320C3[];
extern  VTBL_ENTRY _ZTV7S3320C3[];
Class_Descriptor cd_S3320C3 = {  "S3320C3", // class name
  0,0,//no base classes
  &(vtc_S3320C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3320C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3320C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3320C2  : S3320C3 {
  void *s3320c2f0[2];
  ::S10103C82_nt s3320c2f1;
  ::S10103C82_nt s3320c2f2;
  ::S10103C82_nt s3320c2f3;
  int s3320c2f4[13];
  void *s3320c2f5[3];
  int s3320c2f6[3];
  virtual  ~S3320C2(); // _ZN7S3320C2D1Ev
  virtual void  v15(); // _ZN7S3320C23v15Ev
  virtual void  v16(); // _ZN7S3320C23v16Ev
  virtual void  v17(); // _ZN7S3320C23v17Ev
  virtual void  v18(); // _ZN7S3320C23v18Ev
  virtual void  v19(); // _ZN7S3320C23v19Ev
  virtual void  v20(); // _ZN7S3320C23v20Ev
  S3320C2(); // tgen
};
//SIG(-1 S3320C2) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp[2] FC6{ m FC7{ m FL[2]}} FC6 FC6 Fi[13] Fp[3] Fi[3]}


 S3320C2 ::~S3320C2(){ note_dtor("S3320C2", this);}
void  S3320C2 ::v15(){vfunc_called(this, "_ZN7S3320C23v15Ev");}
void  S3320C2 ::v16(){vfunc_called(this, "_ZN7S3320C23v16Ev");}
void  S3320C2 ::v17(){vfunc_called(this, "_ZN7S3320C23v17Ev");}
void  S3320C2 ::v18(){vfunc_called(this, "_ZN7S3320C23v18Ev");}
void  S3320C2 ::v19(){vfunc_called(this, "_ZN7S3320C23v19Ev");}
void  S3320C2 ::v20(){vfunc_called(this, "_ZN7S3320C23v20Ev");}
S3320C2 ::S3320C2(){ note_ctor("S3320C2", this);} // tgen

static void Test_S3320C2()
{
  extern Class_Descriptor cd_S3320C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,42)];
    init_test(&cd_S3320C2, buf);
    S3320C2 *dp, &lv = *(dp=new (buf) S3320C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,164), "sizeof(S3320C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3320C2)");
    check_base_class_offset(lv, (S3320C3*), 0, "S3320C2");
    check_field_offset(lv, s3320c2f0, ABISELECT(56,32), "S3320C2.s3320c2f0");
    check_field_offset(lv, s3320c2f1, ABISELECT(72,40), "S3320C2.s3320c2f1");
    check_field_offset(lv, s3320c2f2, ABISELECT(88,56), "S3320C2.s3320c2f2");
    check_field_offset(lv, s3320c2f3, ABISELECT(104,72), "S3320C2.s3320c2f3");
    check_field_offset(lv, s3320c2f4, ABISELECT(120,88), "S3320C2.s3320c2f4");
    check_field_offset(lv, s3320c2f5, ABISELECT(176,140), "S3320C2.s3320c2f5");
    check_field_offset(lv, s3320c2f6, ABISELECT(200,152), "S3320C2.s3320c2f6");
    test_class_info(&lv, &cd_S3320C2);
    dp->~S3320C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3320C2(Test_S3320C2, "S3320C2", ABISELECT(216,164));

#else // __cplusplus

extern void _ZN7S3320C2C1Ev();
extern void _ZN7S3320C2D1Ev();
Name_Map name_map_S3320C2[] = {
  NSPAIR(_ZN7S3320C2C1Ev),
  NSPAIR(_ZN7S3320C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3320C3;
extern VTBL_ENTRY _ZTI7S3320C3[];
extern  VTBL_ENTRY _ZTV7S3320C3[];
static Base_Class bases_S3320C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3320C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3320C2[];
extern void _ZN7S3320C2D1Ev();
extern void _ZN7S3320C2D0Ev();
extern void _ZN7S3320C32v5Ev();
extern void _ZN7S3320C32v6Ev();
extern void _ZN7S3320C32v7Ev();
extern void _ZN7S3320C32v8Ev();
extern void _ZN7S3320C32v9Ev();
extern void _ZN7S3320C33v10Ev();
extern void _ZN7S3320C33v11Ev();
extern void _ZN7S3320C33v12Ev();
extern void _ZN7S3320C33v13Ev();
extern void _ZN7S3320C33v14Ev();
extern void _ZN7S3320C23v15Ev();
extern void _ZN7S3320C23v16Ev();
extern void _ZN7S3320C23v17Ev();
extern void _ZN7S3320C23v18Ev();
extern void _ZN7S3320C23v19Ev();
extern void _ZN7S3320C23v20Ev();
static  VTBL_ENTRY vtc_S3320C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3320C2[0]),
  (VTBL_ENTRY)&_ZN7S3320C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3320C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v20Ev,
};
extern VTBL_ENTRY _ZTI7S3320C2[];
extern  VTBL_ENTRY _ZTV7S3320C2[];
Class_Descriptor cd_S3320C2 = {  "S3320C2", // class name
  bases_S3320C2, 1,
  &(vtc_S3320C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,164), // object size
  NSPAIRA(_ZTI7S3320C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3320C2),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3320C1  : S3320C2 {
  int s3320c1f0;
  ::S679C21_nt s3320c1f1;
  ::S679C21_nt s3320c1f2;
  int s3320c1f3[12];
  char s3320c1f4[2];
  virtual  ~S3320C1(); // _ZN7S3320C1D1Ev
  virtual void  v1(); // _ZN7S3320C12v1Ev
  virtual void  v2(); // _ZN7S3320C12v2Ev
  virtual void  v3(); // _ZN7S3320C12v3Ev
  virtual void  v4(); // _ZN7S3320C12v4Ev
  S3320C1(); // tgen
};
//SIG(1 S3320C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 v20 Fp[2] FC7{ m FC8{ m FL[2]}} FC7 FC7 Fi[13] Fp[3] Fi[3]} vd v1 v2 v3 v4 Fi FC9{ m FC8} FC9 Fi[12] Fc[2]}


 S3320C1 ::~S3320C1(){ note_dtor("S3320C1", this);}
void  S3320C1 ::v1(){vfunc_called(this, "_ZN7S3320C12v1Ev");}
void  S3320C1 ::v2(){vfunc_called(this, "_ZN7S3320C12v2Ev");}
void  S3320C1 ::v3(){vfunc_called(this, "_ZN7S3320C12v3Ev");}
void  S3320C1 ::v4(){vfunc_called(this, "_ZN7S3320C12v4Ev");}
S3320C1 ::S3320C1(){ note_ctor("S3320C1", this);} // tgen

static void Test_S3320C1()
{
  extern Class_Descriptor cd_S3320C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(39,64)];
    init_test(&cd_S3320C1, buf);
    S3320C1 *dp, &lv = *(dp=new (buf) S3320C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(304,252), "sizeof(S3320C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3320C1)");
    check_base_class_offset(lv, (S3320C3*)(S3320C2*), 0, "S3320C1");
    check_base_class_offset(lv, (S3320C2*), 0, "S3320C1");
    check_field_offset(lv, s3320c1f0, ABISELECT(212,164), "S3320C1.s3320c1f0");
    check_field_offset(lv, s3320c1f1, ABISELECT(216,168), "S3320C1.s3320c1f1");
    check_field_offset(lv, s3320c1f2, ABISELECT(232,184), "S3320C1.s3320c1f2");
    check_field_offset(lv, s3320c1f3, ABISELECT(248,200), "S3320C1.s3320c1f3");
    check_field_offset(lv, s3320c1f4, ABISELECT(296,248), "S3320C1.s3320c1f4");
    test_class_info(&lv, &cd_S3320C1);
    dp->~S3320C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3320C1(Test_S3320C1, "S3320C1", ABISELECT(304,252));

#else // __cplusplus

extern void _ZN7S3320C1C1Ev();
extern void _ZN7S3320C1D1Ev();
Name_Map name_map_S3320C1[] = {
  NSPAIR(_ZN7S3320C1C1Ev),
  NSPAIR(_ZN7S3320C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3320C3;
extern VTBL_ENTRY _ZTI7S3320C3[];
extern  VTBL_ENTRY _ZTV7S3320C3[];
extern Class_Descriptor cd_S3320C2;
extern VTBL_ENTRY _ZTI7S3320C2[];
extern  VTBL_ENTRY _ZTV7S3320C2[];
static Base_Class bases_S3320C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3320C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3320C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3320C1[];
extern void _ZN7S3320C1D1Ev();
extern void _ZN7S3320C1D0Ev();
extern void _ZN7S3320C32v5Ev();
extern void _ZN7S3320C32v6Ev();
extern void _ZN7S3320C32v7Ev();
extern void _ZN7S3320C32v8Ev();
extern void _ZN7S3320C32v9Ev();
extern void _ZN7S3320C33v10Ev();
extern void _ZN7S3320C33v11Ev();
extern void _ZN7S3320C33v12Ev();
extern void _ZN7S3320C33v13Ev();
extern void _ZN7S3320C33v14Ev();
extern void _ZN7S3320C23v15Ev();
extern void _ZN7S3320C23v16Ev();
extern void _ZN7S3320C23v17Ev();
extern void _ZN7S3320C23v18Ev();
extern void _ZN7S3320C23v19Ev();
extern void _ZN7S3320C23v20Ev();
extern void _ZN7S3320C12v1Ev();
extern void _ZN7S3320C12v2Ev();
extern void _ZN7S3320C12v3Ev();
extern void _ZN7S3320C12v4Ev();
static  VTBL_ENTRY vtc_S3320C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3320C1[0]),
  (VTBL_ENTRY)&_ZN7S3320C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3320C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3320C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3320C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3320C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3320C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3320C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3320C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3320C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3320C1[];
extern  VTBL_ENTRY _ZTV7S3320C1[];
Class_Descriptor cd_S3320C1 = {  "S3320C1", // class name
  bases_S3320C1, 2,
  &(vtc_S3320C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(304,252), // object size
  NSPAIRA(_ZTI7S3320C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3320C1),24, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3312C3  {
  void *s3312c3f0[2];
  ::S10103C13_nt s3312c3f1;
  void *s3312c3f2;
  virtual  ~S3312C3(); // _ZN7S3312C3D1Ev
  virtual void  v5(); // _ZN7S3312C32v5Ev
  virtual void  v6(); // _ZN7S3312C32v6Ev
  virtual void  v7(); // _ZN7S3312C32v7Ev
  virtual void  v8(); // _ZN7S3312C32v8Ev
  virtual void  v9(); // _ZN7S3312C32v9Ev
  virtual void  v10(); // _ZN7S3312C33v10Ev
  virtual void  v11(); // _ZN7S3312C33v11Ev
  virtual void  v12(); // _ZN7S3312C33v12Ev
  virtual void  v13(); // _ZN7S3312C33v13Ev
  virtual void  v14(); // _ZN7S3312C33v14Ev
  S3312C3(); // tgen
};
//SIG(-1 S3312C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3312C3 ::~S3312C3(){ note_dtor("S3312C3", this);}
void  S3312C3 ::v5(){vfunc_called(this, "_ZN7S3312C32v5Ev");}
void  S3312C3 ::v6(){vfunc_called(this, "_ZN7S3312C32v6Ev");}
void  S3312C3 ::v7(){vfunc_called(this, "_ZN7S3312C32v7Ev");}
void  S3312C3 ::v8(){vfunc_called(this, "_ZN7S3312C32v8Ev");}
void  S3312C3 ::v9(){vfunc_called(this, "_ZN7S3312C32v9Ev");}
void  S3312C3 ::v10(){vfunc_called(this, "_ZN7S3312C33v10Ev");}
void  S3312C3 ::v11(){vfunc_called(this, "_ZN7S3312C33v11Ev");}
void  S3312C3 ::v12(){vfunc_called(this, "_ZN7S3312C33v12Ev");}
void  S3312C3 ::v13(){vfunc_called(this, "_ZN7S3312C33v13Ev");}
void  S3312C3 ::v14(){vfunc_called(this, "_ZN7S3312C33v14Ev");}
S3312C3 ::S3312C3(){ note_ctor("S3312C3", this);} // tgen

static void Test_S3312C3()
{
  extern Class_Descriptor cd_S3312C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3312C3, buf);
    S3312C3 *dp, &lv = *(dp=new (buf) S3312C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3312C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3312C3)");
    check_field_offset(lv, s3312c3f0, ABISELECT(8,4), "S3312C3.s3312c3f0");
    check_field_offset(lv, s3312c3f1, ABISELECT(24,12), "S3312C3.s3312c3f1");
    check_field_offset(lv, s3312c3f2, ABISELECT(48,28), "S3312C3.s3312c3f2");
    test_class_info(&lv, &cd_S3312C3);
    dp->~S3312C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3312C3(Test_S3312C3, "S3312C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3312C3C1Ev();
extern void _ZN7S3312C3D1Ev();
Name_Map name_map_S3312C3[] = {
  NSPAIR(_ZN7S3312C3C1Ev),
  NSPAIR(_ZN7S3312C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3312C3[];
extern void _ZN7S3312C3D1Ev();
extern void _ZN7S3312C3D0Ev();
extern void _ZN7S3312C32v5Ev();
extern void _ZN7S3312C32v6Ev();
extern void _ZN7S3312C32v7Ev();
extern void _ZN7S3312C32v8Ev();
extern void _ZN7S3312C32v9Ev();
extern void _ZN7S3312C33v10Ev();
extern void _ZN7S3312C33v11Ev();
extern void _ZN7S3312C33v12Ev();
extern void _ZN7S3312C33v13Ev();
extern void _ZN7S3312C33v14Ev();
static  VTBL_ENTRY vtc_S3312C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3312C3[0]),
  (VTBL_ENTRY)&_ZN7S3312C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3312C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3312C3[];
extern  VTBL_ENTRY _ZTV7S3312C3[];
Class_Descriptor cd_S3312C3 = {  "S3312C3", // class name
  0,0,//no base classes
  &(vtc_S3312C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3312C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3312C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3312C2  : S3312C3 {
  void *s3312c2f0;
  ::S10103C13_nt s3312c2f1;
  ::S10103C13_nt s3312c2f2;
  ::S10103C13_nt s3312c2f3;
  ::S10103C86 s3312c2f4;
  ::S10103C86 s3312c2f5;
  ::S10103C86 s3312c2f6;
  virtual  ~S3312C2(); // _ZN7S3312C2D1Ev
  virtual void  v15(); // _ZN7S3312C23v15Ev
  virtual void  v16(); // _ZN7S3312C23v16Ev
  virtual void  v17(); // _ZN7S3312C23v17Ev
  virtual void  v18(); // _ZN7S3312C23v18Ev
  virtual void  v19(); // _ZN7S3312C23v19Ev
  S3312C2(); // tgen
};
//SIG(-1 S3312C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3312C2 ::~S3312C2(){ note_dtor("S3312C2", this);}
void  S3312C2 ::v15(){vfunc_called(this, "_ZN7S3312C23v15Ev");}
void  S3312C2 ::v16(){vfunc_called(this, "_ZN7S3312C23v16Ev");}
void  S3312C2 ::v17(){vfunc_called(this, "_ZN7S3312C23v17Ev");}
void  S3312C2 ::v18(){vfunc_called(this, "_ZN7S3312C23v18Ev");}
void  S3312C2 ::v19(){vfunc_called(this, "_ZN7S3312C23v19Ev");}
S3312C2 ::S3312C2(){ note_ctor("S3312C2", this);} // tgen

static void Test_S3312C2()
{
  extern Class_Descriptor cd_S3312C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3312C2, buf);
    S3312C2 *dp, &lv = *(dp=new (buf) S3312C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3312C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3312C2)");
    check_base_class_offset(lv, (S3312C3*), 0, "S3312C2");
    check_field_offset(lv, s3312c2f0, ABISELECT(56,32), "S3312C2.s3312c2f0");
    check_field_offset(lv, s3312c2f1, ABISELECT(64,36), "S3312C2.s3312c2f1");
    check_field_offset(lv, s3312c2f2, ABISELECT(88,52), "S3312C2.s3312c2f2");
    check_field_offset(lv, s3312c2f3, ABISELECT(112,68), "S3312C2.s3312c2f3");
    check_field_offset(lv, s3312c2f4, ABISELECT(136,84), "S3312C2.s3312c2f4");
    check_field_offset(lv, s3312c2f5, ABISELECT(152,96), "S3312C2.s3312c2f5");
    check_field_offset(lv, s3312c2f6, ABISELECT(168,108), "S3312C2.s3312c2f6");
    test_class_info(&lv, &cd_S3312C2);
    dp->~S3312C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3312C2(Test_S3312C2, "S3312C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3312C2C1Ev();
extern void _ZN7S3312C2D1Ev();
Name_Map name_map_S3312C2[] = {
  NSPAIR(_ZN7S3312C2C1Ev),
  NSPAIR(_ZN7S3312C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3312C3;
extern VTBL_ENTRY _ZTI7S3312C3[];
extern  VTBL_ENTRY _ZTV7S3312C3[];
static Base_Class bases_S3312C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3312C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3312C2[];
extern void _ZN7S3312C2D1Ev();
extern void _ZN7S3312C2D0Ev();
extern void _ZN7S3312C32v5Ev();
extern void _ZN7S3312C32v6Ev();
extern void _ZN7S3312C32v7Ev();
extern void _ZN7S3312C32v8Ev();
extern void _ZN7S3312C32v9Ev();
extern void _ZN7S3312C33v10Ev();
extern void _ZN7S3312C33v11Ev();
extern void _ZN7S3312C33v12Ev();
extern void _ZN7S3312C33v13Ev();
extern void _ZN7S3312C33v14Ev();
extern void _ZN7S3312C23v15Ev();
extern void _ZN7S3312C23v16Ev();
extern void _ZN7S3312C23v17Ev();
extern void _ZN7S3312C23v18Ev();
extern void _ZN7S3312C23v19Ev();
static  VTBL_ENTRY vtc_S3312C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3312C2[0]),
  (VTBL_ENTRY)&_ZN7S3312C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3312C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3312C2[];
extern  VTBL_ENTRY _ZTV7S3312C2[];
Class_Descriptor cd_S3312C2 = {  "S3312C2", // class name
  bases_S3312C2, 1,
  &(vtc_S3312C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3312C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3312C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3312C1  : S3312C2 {
  ::S10103C82_nt s3312c1f0;
  ::S10103C82_nt s3312c1f1;
  ::S10103C82_nt s3312c1f2;
  ::S10103C82_nt s3312c1f3;
  ::S10103C82_nt s3312c1f4;
  int s3312c1f5[2];
  virtual  ~S3312C1(); // _ZN7S3312C1D1Ev
  virtual void  v1(); // _ZN7S3312C12v1Ev
  virtual void  v2(); // _ZN7S3312C12v2Ev
  virtual void  v3(); // _ZN7S3312C12v3Ev
  virtual void  v4(); // _ZN7S3312C12v4Ev
  S3312C1(); // tgen
};
//SIG(1 S3312C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 FC10{ m FC11{ m FL[2]}} FC10 FC10 FC10 FC10 Fi[2]}


 S3312C1 ::~S3312C1(){ note_dtor("S3312C1", this);}
void  S3312C1 ::v1(){vfunc_called(this, "_ZN7S3312C12v1Ev");}
void  S3312C1 ::v2(){vfunc_called(this, "_ZN7S3312C12v2Ev");}
void  S3312C1 ::v3(){vfunc_called(this, "_ZN7S3312C12v3Ev");}
void  S3312C1 ::v4(){vfunc_called(this, "_ZN7S3312C12v4Ev");}
S3312C1 ::S3312C1(){ note_ctor("S3312C1", this);} // tgen

static void Test_S3312C1()
{
  extern Class_Descriptor cd_S3312C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(35,53)];
    init_test(&cd_S3312C1, buf);
    S3312C1 *dp, &lv = *(dp=new (buf) S3312C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(272,208), "sizeof(S3312C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3312C1)");
    check_base_class_offset(lv, (S3312C3*)(S3312C2*), 0, "S3312C1");
    check_base_class_offset(lv, (S3312C2*), 0, "S3312C1");
    check_field_offset(lv, s3312c1f0, ABISELECT(184,120), "S3312C1.s3312c1f0");
    check_field_offset(lv, s3312c1f1, ABISELECT(200,136), "S3312C1.s3312c1f1");
    check_field_offset(lv, s3312c1f2, ABISELECT(216,152), "S3312C1.s3312c1f2");
    check_field_offset(lv, s3312c1f3, ABISELECT(232,168), "S3312C1.s3312c1f3");
    check_field_offset(lv, s3312c1f4, ABISELECT(248,184), "S3312C1.s3312c1f4");
    check_field_offset(lv, s3312c1f5, ABISELECT(264,200), "S3312C1.s3312c1f5");
    test_class_info(&lv, &cd_S3312C1);
    dp->~S3312C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3312C1(Test_S3312C1, "S3312C1", ABISELECT(272,208));

#else // __cplusplus

extern void _ZN7S3312C1C1Ev();
extern void _ZN7S3312C1D1Ev();
Name_Map name_map_S3312C1[] = {
  NSPAIR(_ZN7S3312C1C1Ev),
  NSPAIR(_ZN7S3312C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3312C3;
extern VTBL_ENTRY _ZTI7S3312C3[];
extern  VTBL_ENTRY _ZTV7S3312C3[];
extern Class_Descriptor cd_S3312C2;
extern VTBL_ENTRY _ZTI7S3312C2[];
extern  VTBL_ENTRY _ZTV7S3312C2[];
static Base_Class bases_S3312C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3312C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3312C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3312C1[];
extern void _ZN7S3312C1D1Ev();
extern void _ZN7S3312C1D0Ev();
extern void _ZN7S3312C32v5Ev();
extern void _ZN7S3312C32v6Ev();
extern void _ZN7S3312C32v7Ev();
extern void _ZN7S3312C32v8Ev();
extern void _ZN7S3312C32v9Ev();
extern void _ZN7S3312C33v10Ev();
extern void _ZN7S3312C33v11Ev();
extern void _ZN7S3312C33v12Ev();
extern void _ZN7S3312C33v13Ev();
extern void _ZN7S3312C33v14Ev();
extern void _ZN7S3312C23v15Ev();
extern void _ZN7S3312C23v16Ev();
extern void _ZN7S3312C23v17Ev();
extern void _ZN7S3312C23v18Ev();
extern void _ZN7S3312C23v19Ev();
extern void _ZN7S3312C12v1Ev();
extern void _ZN7S3312C12v2Ev();
extern void _ZN7S3312C12v3Ev();
extern void _ZN7S3312C12v4Ev();
static  VTBL_ENTRY vtc_S3312C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3312C1[0]),
  (VTBL_ENTRY)&_ZN7S3312C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3312C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3312C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3312C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3312C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3312C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3312C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3312C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3312C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3312C1[];
extern  VTBL_ENTRY _ZTV7S3312C1[];
Class_Descriptor cd_S3312C1 = {  "S3312C1", // class name
  bases_S3312C1, 2,
  &(vtc_S3312C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(272,208), // object size
  NSPAIRA(_ZTI7S3312C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3312C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3094C3  {
  void *s3094c3f0[2];
  ::S10103C13_nt s3094c3f1;
  void *s3094c3f2;
  virtual  ~S3094C3(); // _ZN7S3094C3D1Ev
  virtual void  v2(); // _ZN7S3094C32v2Ev
  virtual void  v3(); // _ZN7S3094C32v3Ev
  virtual void  v4(); // _ZN7S3094C32v4Ev
  virtual void  v5(); // _ZN7S3094C32v5Ev
  virtual void  v6(); // _ZN7S3094C32v6Ev
  virtual void  v7(); // _ZN7S3094C32v7Ev
  virtual void  v8(); // _ZN7S3094C32v8Ev
  virtual void  v9(); // _ZN7S3094C32v9Ev
  virtual void  v10(); // _ZN7S3094C33v10Ev
  virtual void  v11(); // _ZN7S3094C33v11Ev
  S3094C3(); // tgen
};
//SIG(-1 S3094C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3094C3 ::~S3094C3(){ note_dtor("S3094C3", this);}
void  S3094C3 ::v2(){vfunc_called(this, "_ZN7S3094C32v2Ev");}
void  S3094C3 ::v3(){vfunc_called(this, "_ZN7S3094C32v3Ev");}
void  S3094C3 ::v4(){vfunc_called(this, "_ZN7S3094C32v4Ev");}
void  S3094C3 ::v5(){vfunc_called(this, "_ZN7S3094C32v5Ev");}
void  S3094C3 ::v6(){vfunc_called(this, "_ZN7S3094C32v6Ev");}
void  S3094C3 ::v7(){vfunc_called(this, "_ZN7S3094C32v7Ev");}
void  S3094C3 ::v8(){vfunc_called(this, "_ZN7S3094C32v8Ev");}
void  S3094C3 ::v9(){vfunc_called(this, "_ZN7S3094C32v9Ev");}
void  S3094C3 ::v10(){vfunc_called(this, "_ZN7S3094C33v10Ev");}
void  S3094C3 ::v11(){vfunc_called(this, "_ZN7S3094C33v11Ev");}
S3094C3 ::S3094C3(){ note_ctor("S3094C3", this);} // tgen

static void Test_S3094C3()
{
  extern Class_Descriptor cd_S3094C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3094C3, buf);
    S3094C3 *dp, &lv = *(dp=new (buf) S3094C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3094C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3094C3)");
    check_field_offset(lv, s3094c3f0, ABISELECT(8,4), "S3094C3.s3094c3f0");
    check_field_offset(lv, s3094c3f1, ABISELECT(24,12), "S3094C3.s3094c3f1");
    check_field_offset(lv, s3094c3f2, ABISELECT(48,28), "S3094C3.s3094c3f2");
    test_class_info(&lv, &cd_S3094C3);
    dp->~S3094C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3094C3(Test_S3094C3, "S3094C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3094C3C1Ev();
extern void _ZN7S3094C3D1Ev();
Name_Map name_map_S3094C3[] = {
  NSPAIR(_ZN7S3094C3C1Ev),
  NSPAIR(_ZN7S3094C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3094C3[];
extern void _ZN7S3094C3D1Ev();
extern void _ZN7S3094C3D0Ev();
extern void _ZN7S3094C32v2Ev();
extern void _ZN7S3094C32v3Ev();
extern void _ZN7S3094C32v4Ev();
extern void _ZN7S3094C32v5Ev();
extern void _ZN7S3094C32v6Ev();
extern void _ZN7S3094C32v7Ev();
extern void _ZN7S3094C32v8Ev();
extern void _ZN7S3094C32v9Ev();
extern void _ZN7S3094C33v10Ev();
extern void _ZN7S3094C33v11Ev();
static  VTBL_ENTRY vtc_S3094C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3094C3[0]),
  (VTBL_ENTRY)&_ZN7S3094C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3094C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3094C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3094C33v11Ev,
};
extern VTBL_ENTRY _ZTI7S3094C3[];
extern  VTBL_ENTRY _ZTV7S3094C3[];
Class_Descriptor cd_S3094C3 = {  "S3094C3", // class name
  0,0,//no base classes
  &(vtc_S3094C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3094C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3094C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3094C2  : S3094C3 {
  ::S10103C86 s3094c2f0;
  ::S10103C106 s3094c2f1;
  ::S10103C82_nt s3094c2f2;
  ::S10103C13_nt s3094c2f3;
  virtual  ~S3094C2(); // _ZN7S3094C2D1Ev
  virtual void  v12(); // _ZN7S3094C23v12Ev
  virtual void  v13(); // _ZN7S3094C23v13Ev
  virtual void  v14(); // _ZN7S3094C23v14Ev
  virtual void  v15(); // _ZN7S3094C23v15Ev
  virtual void  v16(); // _ZN7S3094C23v16Ev
  virtual void  v17(); // _ZN7S3094C23v17Ev
  virtual void  v18(); // _ZN7S3094C23v18Ev
  virtual void  v19(); // _ZN7S3094C23v19Ev
  virtual void  v20(); // _ZN7S3094C23v20Ev
  virtual void  v21(); // _ZN7S3094C23v21Ev
  virtual void  v22(); // _ZN7S3094C23v22Ev
  virtual void  v23(); // _ZN7S3094C23v23Ev
  virtual void  v24(); // _ZN7S3094C23v24Ev
  virtual void  v25(); // _ZN7S3094C23v25Ev
  S3094C2(); // tgen
};
//SIG(-1 S3094C2) C1{ BC2{ vd v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m Fp Fi[2] FC8} FC10{ m FC11{ m FL[2]}} FC3}


 S3094C2 ::~S3094C2(){ note_dtor("S3094C2", this);}
void  S3094C2 ::v12(){vfunc_called(this, "_ZN7S3094C23v12Ev");}
void  S3094C2 ::v13(){vfunc_called(this, "_ZN7S3094C23v13Ev");}
void  S3094C2 ::v14(){vfunc_called(this, "_ZN7S3094C23v14Ev");}
void  S3094C2 ::v15(){vfunc_called(this, "_ZN7S3094C23v15Ev");}
void  S3094C2 ::v16(){vfunc_called(this, "_ZN7S3094C23v16Ev");}
void  S3094C2 ::v17(){vfunc_called(this, "_ZN7S3094C23v17Ev");}
void  S3094C2 ::v18(){vfunc_called(this, "_ZN7S3094C23v18Ev");}
void  S3094C2 ::v19(){vfunc_called(this, "_ZN7S3094C23v19Ev");}
void  S3094C2 ::v20(){vfunc_called(this, "_ZN7S3094C23v20Ev");}
void  S3094C2 ::v21(){vfunc_called(this, "_ZN7S3094C23v21Ev");}
void  S3094C2 ::v22(){vfunc_called(this, "_ZN7S3094C23v22Ev");}
void  S3094C2 ::v23(){vfunc_called(this, "_ZN7S3094C23v23Ev");}
void  S3094C2 ::v24(){vfunc_called(this, "_ZN7S3094C23v24Ev");}
void  S3094C2 ::v25(){vfunc_called(this, "_ZN7S3094C23v25Ev");}
S3094C2 ::S3094C2(){ note_ctor("S3094C2", this);} // tgen

static void Test_S3094C2()
{
  extern Class_Descriptor cd_S3094C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3094C2, buf);
    S3094C2 *dp, &lv = *(dp=new (buf) S3094C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3094C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3094C2)");
    check_base_class_offset(lv, (S3094C3*), 0, "S3094C2");
    check_field_offset(lv, s3094c2f0, ABISELECT(56,32), "S3094C2.s3094c2f0");
    check_field_offset(lv, s3094c2f1, ABISELECT(72,44), "S3094C2.s3094c2f1");
    check_field_offset(lv, s3094c2f2, ABISELECT(96,60), "S3094C2.s3094c2f2");
    check_field_offset(lv, s3094c2f3, ABISELECT(112,76), "S3094C2.s3094c2f3");
    test_class_info(&lv, &cd_S3094C2);
    dp->~S3094C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3094C2(Test_S3094C2, "S3094C2", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3094C2C1Ev();
extern void _ZN7S3094C2D1Ev();
Name_Map name_map_S3094C2[] = {
  NSPAIR(_ZN7S3094C2C1Ev),
  NSPAIR(_ZN7S3094C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3094C3;
extern VTBL_ENTRY _ZTI7S3094C3[];
extern  VTBL_ENTRY _ZTV7S3094C3[];
static Base_Class bases_S3094C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3094C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3094C2[];
extern void _ZN7S3094C2D1Ev();
extern void _ZN7S3094C2D0Ev();
extern void _ZN7S3094C32v2Ev();
extern void _ZN7S3094C32v3Ev();
extern void _ZN7S3094C32v4Ev();
extern void _ZN7S3094C32v5Ev();
extern void _ZN7S3094C32v6Ev();
extern void _ZN7S3094C32v7Ev();
extern void _ZN7S3094C32v8Ev();
extern void _ZN7S3094C32v9Ev();
extern void _ZN7S3094C33v10Ev();
extern void _ZN7S3094C33v11Ev();
extern void _ZN7S3094C23v12Ev();
extern void _ZN7S3094C23v13Ev();
extern void _ZN7S3094C23v14Ev();
extern void _ZN7S3094C23v15Ev();
extern void _ZN7S3094C23v16Ev();
extern void _ZN7S3094C23v17Ev();
extern void _ZN7S3094C23v18Ev();
extern void _ZN7S3094C23v19Ev();
extern void _ZN7S3094C23v20Ev();
extern void _ZN7S3094C23v21Ev();
extern void _ZN7S3094C23v22Ev();
extern void _ZN7S3094C23v23Ev();
extern void _ZN7S3094C23v24Ev();
extern void _ZN7S3094C23v25Ev();
static  VTBL_ENTRY vtc_S3094C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3094C2[0]),
  (VTBL_ENTRY)&_ZN7S3094C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3094C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3094C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3094C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v25Ev,
};
extern VTBL_ENTRY _ZTI7S3094C2[];
extern  VTBL_ENTRY _ZTV7S3094C2[];
Class_Descriptor cd_S3094C2 = {  "S3094C2", // class name
  bases_S3094C2, 1,
  &(vtc_S3094C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3094C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3094C2),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3094C1  : S3094C2 {
  virtual void  v1(); // _ZN7S3094C12v1Ev
  ~S3094C1(); // tgen
  S3094C1(); // tgen
};
//SIG(1 S3094C1) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m Fp Fi[2] FC9} FC11{ m FC12{ m FL[2]}} FC4} v1}


void  S3094C1 ::v1(){vfunc_called(this, "_ZN7S3094C12v1Ev");}
S3094C1 ::~S3094C1(){ note_dtor("S3094C1", this);} // tgen
S3094C1 ::S3094C1(){ note_ctor("S3094C1", this);} // tgen

static void Test_S3094C1()
{
  extern Class_Descriptor cd_S3094C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(18,24)];
    init_test(&cd_S3094C1, buf);
    S3094C1 *dp, &lv = *(dp=new (buf) S3094C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(136,92), "sizeof(S3094C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3094C1)");
    check_base_class_offset(lv, (S3094C3*)(S3094C2*), 0, "S3094C1");
    check_base_class_offset(lv, (S3094C2*), 0, "S3094C1");
    test_class_info(&lv, &cd_S3094C1);
    dp->~S3094C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3094C1(Test_S3094C1, "S3094C1", ABISELECT(136,92));

#else // __cplusplus

extern void _ZN7S3094C1C1Ev();
extern void _ZN7S3094C1D1Ev();
Name_Map name_map_S3094C1[] = {
  NSPAIR(_ZN7S3094C1C1Ev),
  NSPAIR(_ZN7S3094C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3094C3;
extern VTBL_ENTRY _ZTI7S3094C3[];
extern  VTBL_ENTRY _ZTV7S3094C3[];
extern Class_Descriptor cd_S3094C2;
extern VTBL_ENTRY _ZTI7S3094C2[];
extern  VTBL_ENTRY _ZTV7S3094C2[];
static Base_Class bases_S3094C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3094C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3094C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3094C1[];
extern void _ZN7S3094C1D1Ev();
extern void _ZN7S3094C1D0Ev();
extern void _ZN7S3094C32v2Ev();
extern void _ZN7S3094C32v3Ev();
extern void _ZN7S3094C32v4Ev();
extern void _ZN7S3094C32v5Ev();
extern void _ZN7S3094C32v6Ev();
extern void _ZN7S3094C32v7Ev();
extern void _ZN7S3094C32v8Ev();
extern void _ZN7S3094C32v9Ev();
extern void _ZN7S3094C33v10Ev();
extern void _ZN7S3094C33v11Ev();
extern void _ZN7S3094C23v12Ev();
extern void _ZN7S3094C23v13Ev();
extern void _ZN7S3094C23v14Ev();
extern void _ZN7S3094C23v15Ev();
extern void _ZN7S3094C23v16Ev();
extern void _ZN7S3094C23v17Ev();
extern void _ZN7S3094C23v18Ev();
extern void _ZN7S3094C23v19Ev();
extern void _ZN7S3094C23v20Ev();
extern void _ZN7S3094C23v21Ev();
extern void _ZN7S3094C23v22Ev();
extern void _ZN7S3094C23v23Ev();
extern void _ZN7S3094C23v24Ev();
extern void _ZN7S3094C23v25Ev();
extern void _ZN7S3094C12v1Ev();
static  VTBL_ENTRY vtc_S3094C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3094C1[0]),
  (VTBL_ENTRY)&_ZN7S3094C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3094C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3094C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3094C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3094C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v20Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v21Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v22Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v23Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v24Ev,
  (VTBL_ENTRY)&_ZN7S3094C23v25Ev,
  (VTBL_ENTRY)&_ZN7S3094C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S3094C1[];
extern  VTBL_ENTRY _ZTV7S3094C1[];
Class_Descriptor cd_S3094C1 = {  "S3094C1", // class name
  bases_S3094C1, 2,
  &(vtc_S3094C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(136,92), // object size
  NSPAIRA(_ZTI7S3094C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3094C1),29, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1479C4  {
  void *s1479c4f0[2];
  ::S10103C13_nt s1479c4f1;
  void *s1479c4f2;
  virtual  ~S1479C4(); // _ZN7S1479C4D1Ev
  virtual void  v5(); // _ZN7S1479C42v5Ev
  virtual void  v6(); // _ZN7S1479C42v6Ev
  virtual void  v7(); // _ZN7S1479C42v7Ev
  virtual void  v8(); // _ZN7S1479C42v8Ev
  virtual void  v9(); // _ZN7S1479C42v9Ev
  virtual void  v10(); // _ZN7S1479C43v10Ev
  virtual void  v11(); // _ZN7S1479C43v11Ev
  virtual void  v12(); // _ZN7S1479C43v12Ev
  virtual void  v13(); // _ZN7S1479C43v13Ev
  virtual void  v14(); // _ZN7S1479C43v14Ev
  S1479C4(); // tgen
};
//SIG(-1 S1479C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1479C4 ::~S1479C4(){ note_dtor("S1479C4", this);}
void  S1479C4 ::v5(){vfunc_called(this, "_ZN7S1479C42v5Ev");}
void  S1479C4 ::v6(){vfunc_called(this, "_ZN7S1479C42v6Ev");}
void  S1479C4 ::v7(){vfunc_called(this, "_ZN7S1479C42v7Ev");}
void  S1479C4 ::v8(){vfunc_called(this, "_ZN7S1479C42v8Ev");}
void  S1479C4 ::v9(){vfunc_called(this, "_ZN7S1479C42v9Ev");}
void  S1479C4 ::v10(){vfunc_called(this, "_ZN7S1479C43v10Ev");}
void  S1479C4 ::v11(){vfunc_called(this, "_ZN7S1479C43v11Ev");}
void  S1479C4 ::v12(){vfunc_called(this, "_ZN7S1479C43v12Ev");}
void  S1479C4 ::v13(){vfunc_called(this, "_ZN7S1479C43v13Ev");}
void  S1479C4 ::v14(){vfunc_called(this, "_ZN7S1479C43v14Ev");}
S1479C4 ::S1479C4(){ note_ctor("S1479C4", this);} // tgen

static void Test_S1479C4()
{
  extern Class_Descriptor cd_S1479C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1479C4, buf);
    S1479C4 *dp, &lv = *(dp=new (buf) S1479C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1479C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1479C4)");
    check_field_offset(lv, s1479c4f0, ABISELECT(8,4), "S1479C4.s1479c4f0");
    check_field_offset(lv, s1479c4f1, ABISELECT(24,12), "S1479C4.s1479c4f1");
    check_field_offset(lv, s1479c4f2, ABISELECT(48,28), "S1479C4.s1479c4f2");
    test_class_info(&lv, &cd_S1479C4);
    dp->~S1479C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1479C4(Test_S1479C4, "S1479C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1479C4C1Ev();
extern void _ZN7S1479C4D1Ev();
Name_Map name_map_S1479C4[] = {
  NSPAIR(_ZN7S1479C4C1Ev),
  NSPAIR(_ZN7S1479C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1479C4[];
extern void _ZN7S1479C4D1Ev();
extern void _ZN7S1479C4D0Ev();
extern void _ZN7S1479C42v5Ev();
extern void _ZN7S1479C42v6Ev();
extern void _ZN7S1479C42v7Ev();
extern void _ZN7S1479C42v8Ev();
extern void _ZN7S1479C42v9Ev();
extern void _ZN7S1479C43v10Ev();
extern void _ZN7S1479C43v11Ev();
extern void _ZN7S1479C43v12Ev();
extern void _ZN7S1479C43v13Ev();
extern void _ZN7S1479C43v14Ev();
static  VTBL_ENTRY vtc_S1479C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1479C4[0]),
  (VTBL_ENTRY)&_ZN7S1479C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1479C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1479C4[];
extern  VTBL_ENTRY _ZTV7S1479C4[];
Class_Descriptor cd_S1479C4 = {  "S1479C4", // class name
  0,0,//no base classes
  &(vtc_S1479C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1479C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1479C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1479C3  : S1479C4 {
  void *s1479c3f0;
  ::S10103C13_nt s1479c3f1;
  ::S10103C13_nt s1479c3f2;
  ::S10103C13_nt s1479c3f3;
  ::S10103C86 s1479c3f4;
  ::S10103C86 s1479c3f5;
  ::S10103C86 s1479c3f6;
  virtual  ~S1479C3(); // _ZN7S1479C3D1Ev
  virtual void  v15(); // _ZN7S1479C33v15Ev
  virtual void  v16(); // _ZN7S1479C33v16Ev
  virtual void  v17(); // _ZN7S1479C33v17Ev
  virtual void  v18(); // _ZN7S1479C33v18Ev
  virtual void  v19(); // _ZN7S1479C33v19Ev
  S1479C3(); // tgen
};
//SIG(-1 S1479C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1479C3 ::~S1479C3(){ note_dtor("S1479C3", this);}
void  S1479C3 ::v15(){vfunc_called(this, "_ZN7S1479C33v15Ev");}
void  S1479C3 ::v16(){vfunc_called(this, "_ZN7S1479C33v16Ev");}
void  S1479C3 ::v17(){vfunc_called(this, "_ZN7S1479C33v17Ev");}
void  S1479C3 ::v18(){vfunc_called(this, "_ZN7S1479C33v18Ev");}
void  S1479C3 ::v19(){vfunc_called(this, "_ZN7S1479C33v19Ev");}
S1479C3 ::S1479C3(){ note_ctor("S1479C3", this);} // tgen

static void Test_S1479C3()
{
  extern Class_Descriptor cd_S1479C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1479C3, buf);
    S1479C3 *dp, &lv = *(dp=new (buf) S1479C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1479C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1479C3)");
    check_base_class_offset(lv, (S1479C4*), 0, "S1479C3");
    check_field_offset(lv, s1479c3f0, ABISELECT(56,32), "S1479C3.s1479c3f0");
    check_field_offset(lv, s1479c3f1, ABISELECT(64,36), "S1479C3.s1479c3f1");
    check_field_offset(lv, s1479c3f2, ABISELECT(88,52), "S1479C3.s1479c3f2");
    check_field_offset(lv, s1479c3f3, ABISELECT(112,68), "S1479C3.s1479c3f3");
    check_field_offset(lv, s1479c3f4, ABISELECT(136,84), "S1479C3.s1479c3f4");
    check_field_offset(lv, s1479c3f5, ABISELECT(152,96), "S1479C3.s1479c3f5");
    check_field_offset(lv, s1479c3f6, ABISELECT(168,108), "S1479C3.s1479c3f6");
    test_class_info(&lv, &cd_S1479C3);
    dp->~S1479C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1479C3(Test_S1479C3, "S1479C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1479C3C1Ev();
extern void _ZN7S1479C3D1Ev();
Name_Map name_map_S1479C3[] = {
  NSPAIR(_ZN7S1479C3C1Ev),
  NSPAIR(_ZN7S1479C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1479C4;
extern VTBL_ENTRY _ZTI7S1479C4[];
extern  VTBL_ENTRY _ZTV7S1479C4[];
static Base_Class bases_S1479C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1479C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1479C3[];
extern void _ZN7S1479C3D1Ev();
extern void _ZN7S1479C3D0Ev();
extern void _ZN7S1479C42v5Ev();
extern void _ZN7S1479C42v6Ev();
extern void _ZN7S1479C42v7Ev();
extern void _ZN7S1479C42v8Ev();
extern void _ZN7S1479C42v9Ev();
extern void _ZN7S1479C43v10Ev();
extern void _ZN7S1479C43v11Ev();
extern void _ZN7S1479C43v12Ev();
extern void _ZN7S1479C43v13Ev();
extern void _ZN7S1479C43v14Ev();
extern void _ZN7S1479C33v15Ev();
extern void _ZN7S1479C33v16Ev();
extern void _ZN7S1479C33v17Ev();
extern void _ZN7S1479C33v18Ev();
extern void _ZN7S1479C33v19Ev();
static  VTBL_ENTRY vtc_S1479C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1479C3[0]),
  (VTBL_ENTRY)&_ZN7S1479C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1479C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1479C3[];
extern  VTBL_ENTRY _ZTV7S1479C3[];
Class_Descriptor cd_S1479C3 = {  "S1479C3", // class name
  bases_S1479C3, 1,
  &(vtc_S1479C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1479C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1479C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1479C2  : S1479C3 {
  int s1479c2f0[2];
  char s1479c2f1;
  int s1479c2f2[2];
  ::S10103C13_nt s1479c2f3;
  ::S10103C13_nt s1479c2f4;
  virtual void  v20(); // _ZN7S1479C23v20Ev
  virtual void  v21(); // _ZN7S1479C23v21Ev
  virtual void  v22(); // _ZN7S1479C23v22Ev
  virtual void  v23(); // _ZN7S1479C23v23Ev
  ~S1479C2(); // tgen
  S1479C2(); // tgen
};
//SIG(-1 S1479C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fi[2] Fc Fi[2] FC4 FC4}


void  S1479C2 ::v20(){vfunc_called(this, "_ZN7S1479C23v20Ev");}
void  S1479C2 ::v21(){vfunc_called(this, "_ZN7S1479C23v21Ev");}
void  S1479C2 ::v22(){vfunc_called(this, "_ZN7S1479C23v22Ev");}
void  S1479C2 ::v23(){vfunc_called(this, "_ZN7S1479C23v23Ev");}
S1479C2 ::~S1479C2(){ note_dtor("S1479C2", this);} // tgen
S1479C2 ::S1479C2(){ note_ctor("S1479C2", this);} // tgen

static void Test_S1479C2()
{
  extern Class_Descriptor cd_S1479C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,44)];
    init_test(&cd_S1479C2, buf);
    S1479C2 *dp, &lv = *(dp=new (buf) S1479C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,172), "sizeof(S1479C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1479C2)");
    check_base_class_offset(lv, (S1479C4*)(S1479C3*), 0, "S1479C2");
    check_base_class_offset(lv, (S1479C3*), 0, "S1479C2");
    check_field_offset(lv, s1479c2f0, ABISELECT(184,120), "S1479C2.s1479c2f0");
    check_field_offset(lv, s1479c2f1, ABISELECT(192,128), "S1479C2.s1479c2f1");
    check_field_offset(lv, s1479c2f2, ABISELECT(196,132), "S1479C2.s1479c2f2");
    check_field_offset(lv, s1479c2f3, ABISELECT(208,140), "S1479C2.s1479c2f3");
    check_field_offset(lv, s1479c2f4, ABISELECT(232,156), "S1479C2.s1479c2f4");
    test_class_info(&lv, &cd_S1479C2);
    dp->~S1479C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1479C2(Test_S1479C2, "S1479C2", ABISELECT(256,172));

#else // __cplusplus

extern void _ZN7S1479C2C1Ev();
extern void _ZN7S1479C2D1Ev();
Name_Map name_map_S1479C2[] = {
  NSPAIR(_ZN7S1479C2C1Ev),
  NSPAIR(_ZN7S1479C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1479C4;
extern VTBL_ENTRY _ZTI7S1479C4[];
extern  VTBL_ENTRY _ZTV7S1479C4[];
extern Class_Descriptor cd_S1479C3;
extern VTBL_ENTRY _ZTI7S1479C3[];
extern  VTBL_ENTRY _ZTV7S1479C3[];
static Base_Class bases_S1479C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1479C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1479C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1479C2[];
extern void _ZN7S1479C2D1Ev();
extern void _ZN7S1479C2D0Ev();
extern void _ZN7S1479C42v5Ev();
extern void _ZN7S1479C42v6Ev();
extern void _ZN7S1479C42v7Ev();
extern void _ZN7S1479C42v8Ev();
extern void _ZN7S1479C42v9Ev();
extern void _ZN7S1479C43v10Ev();
extern void _ZN7S1479C43v11Ev();
extern void _ZN7S1479C43v12Ev();
extern void _ZN7S1479C43v13Ev();
extern void _ZN7S1479C43v14Ev();
extern void _ZN7S1479C33v15Ev();
extern void _ZN7S1479C33v16Ev();
extern void _ZN7S1479C33v17Ev();
extern void _ZN7S1479C33v18Ev();
extern void _ZN7S1479C33v19Ev();
extern void _ZN7S1479C23v20Ev();
extern void _ZN7S1479C23v21Ev();
extern void _ZN7S1479C23v22Ev();
extern void _ZN7S1479C23v23Ev();
static  VTBL_ENTRY vtc_S1479C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1479C2[0]),
  (VTBL_ENTRY)&_ZN7S1479C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1479C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1479C2[];
extern  VTBL_ENTRY _ZTV7S1479C2[];
Class_Descriptor cd_S1479C2 = {  "S1479C2", // class name
  bases_S1479C2, 2,
  &(vtc_S1479C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,172), // object size
  NSPAIRA(_ZTI7S1479C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1479C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1479C1  : S1479C2 {
  int s1479c1f0;
  virtual void  v1(); // _ZN7S1479C12v1Ev
  virtual void  v2(); // _ZN7S1479C12v2Ev
  virtual void  v3(); // _ZN7S1479C12v3Ev
  virtual void  v4(); // _ZN7S1479C12v4Ev
  ~S1479C1(); // tgen
  S1479C1(); // tgen
};
//SIG(1 S1479C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fi[2] Fc Fi[2] FC5 FC5} v1 v2 v3 v4 Fi}


void  S1479C1 ::v1(){vfunc_called(this, "_ZN7S1479C12v1Ev");}
void  S1479C1 ::v2(){vfunc_called(this, "_ZN7S1479C12v2Ev");}
void  S1479C1 ::v3(){vfunc_called(this, "_ZN7S1479C12v3Ev");}
void  S1479C1 ::v4(){vfunc_called(this, "_ZN7S1479C12v4Ev");}
S1479C1 ::~S1479C1(){ note_dtor("S1479C1", this);} // tgen
S1479C1 ::S1479C1(){ note_ctor("S1479C1", this);} // tgen

static void Test_S1479C1()
{
  extern Class_Descriptor cd_S1479C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(34,45)];
    init_test(&cd_S1479C1, buf);
    S1479C1 *dp, &lv = *(dp=new (buf) S1479C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(264,176), "sizeof(S1479C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1479C1)");
    check_base_class_offset(lv, (S1479C4*)(S1479C3*)(S1479C2*), 0, "S1479C1");
    check_base_class_offset(lv, (S1479C3*)(S1479C2*), 0, "S1479C1");
    check_base_class_offset(lv, (S1479C2*), 0, "S1479C1");
    check_field_offset(lv, s1479c1f0, ABISELECT(256,172), "S1479C1.s1479c1f0");
    test_class_info(&lv, &cd_S1479C1);
    dp->~S1479C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1479C1(Test_S1479C1, "S1479C1", ABISELECT(264,176));

#else // __cplusplus

extern void _ZN7S1479C1C1Ev();
extern void _ZN7S1479C1D1Ev();
Name_Map name_map_S1479C1[] = {
  NSPAIR(_ZN7S1479C1C1Ev),
  NSPAIR(_ZN7S1479C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1479C4;
extern VTBL_ENTRY _ZTI7S1479C4[];
extern  VTBL_ENTRY _ZTV7S1479C4[];
extern Class_Descriptor cd_S1479C3;
extern VTBL_ENTRY _ZTI7S1479C3[];
extern  VTBL_ENTRY _ZTV7S1479C3[];
extern Class_Descriptor cd_S1479C2;
extern VTBL_ENTRY _ZTI7S1479C2[];
extern  VTBL_ENTRY _ZTV7S1479C2[];
static Base_Class bases_S1479C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1479C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1479C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1479C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1479C1[];
extern void _ZN7S1479C1D1Ev();
extern void _ZN7S1479C1D0Ev();
extern void _ZN7S1479C42v5Ev();
extern void _ZN7S1479C42v6Ev();
extern void _ZN7S1479C42v7Ev();
extern void _ZN7S1479C42v8Ev();
extern void _ZN7S1479C42v9Ev();
extern void _ZN7S1479C43v10Ev();
extern void _ZN7S1479C43v11Ev();
extern void _ZN7S1479C43v12Ev();
extern void _ZN7S1479C43v13Ev();
extern void _ZN7S1479C43v14Ev();
extern void _ZN7S1479C33v15Ev();
extern void _ZN7S1479C33v16Ev();
extern void _ZN7S1479C33v17Ev();
extern void _ZN7S1479C33v18Ev();
extern void _ZN7S1479C33v19Ev();
extern void _ZN7S1479C23v20Ev();
extern void _ZN7S1479C23v21Ev();
extern void _ZN7S1479C23v22Ev();
extern void _ZN7S1479C23v23Ev();
extern void _ZN7S1479C12v1Ev();
extern void _ZN7S1479C12v2Ev();
extern void _ZN7S1479C12v3Ev();
extern void _ZN7S1479C12v4Ev();
static  VTBL_ENTRY vtc_S1479C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1479C1[0]),
  (VTBL_ENTRY)&_ZN7S1479C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1479C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1479C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1479C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1479C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1479C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1479C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1479C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1479C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1479C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1479C1[];
extern  VTBL_ENTRY _ZTV7S1479C1[];
Class_Descriptor cd_S1479C1 = {  "S1479C1", // class name
  bases_S1479C1, 3,
  &(vtc_S1479C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(264,176), // object size
  NSPAIRA(_ZTI7S1479C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1479C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1480C4  {
  void *s1480c4f0[2];
  ::S10103C13_nt s1480c4f1;
  void *s1480c4f2;
  virtual  ~S1480C4(); // _ZN7S1480C4D1Ev
  virtual void  v5(); // _ZN7S1480C42v5Ev
  virtual void  v6(); // _ZN7S1480C42v6Ev
  virtual void  v7(); // _ZN7S1480C42v7Ev
  virtual void  v8(); // _ZN7S1480C42v8Ev
  virtual void  v9(); // _ZN7S1480C42v9Ev
  virtual void  v10(); // _ZN7S1480C43v10Ev
  virtual void  v11(); // _ZN7S1480C43v11Ev
  virtual void  v12(); // _ZN7S1480C43v12Ev
  virtual void  v13(); // _ZN7S1480C43v13Ev
  virtual void  v14(); // _ZN7S1480C43v14Ev
  S1480C4(); // tgen
};
//SIG(-1 S1480C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1480C4 ::~S1480C4(){ note_dtor("S1480C4", this);}
void  S1480C4 ::v5(){vfunc_called(this, "_ZN7S1480C42v5Ev");}
void  S1480C4 ::v6(){vfunc_called(this, "_ZN7S1480C42v6Ev");}
void  S1480C4 ::v7(){vfunc_called(this, "_ZN7S1480C42v7Ev");}
void  S1480C4 ::v8(){vfunc_called(this, "_ZN7S1480C42v8Ev");}
void  S1480C4 ::v9(){vfunc_called(this, "_ZN7S1480C42v9Ev");}
void  S1480C4 ::v10(){vfunc_called(this, "_ZN7S1480C43v10Ev");}
void  S1480C4 ::v11(){vfunc_called(this, "_ZN7S1480C43v11Ev");}
void  S1480C4 ::v12(){vfunc_called(this, "_ZN7S1480C43v12Ev");}
void  S1480C4 ::v13(){vfunc_called(this, "_ZN7S1480C43v13Ev");}
void  S1480C4 ::v14(){vfunc_called(this, "_ZN7S1480C43v14Ev");}
S1480C4 ::S1480C4(){ note_ctor("S1480C4", this);} // tgen

static void Test_S1480C4()
{
  extern Class_Descriptor cd_S1480C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1480C4, buf);
    S1480C4 *dp, &lv = *(dp=new (buf) S1480C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1480C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1480C4)");
    check_field_offset(lv, s1480c4f0, ABISELECT(8,4), "S1480C4.s1480c4f0");
    check_field_offset(lv, s1480c4f1, ABISELECT(24,12), "S1480C4.s1480c4f1");
    check_field_offset(lv, s1480c4f2, ABISELECT(48,28), "S1480C4.s1480c4f2");
    test_class_info(&lv, &cd_S1480C4);
    dp->~S1480C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1480C4(Test_S1480C4, "S1480C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1480C4C1Ev();
extern void _ZN7S1480C4D1Ev();
Name_Map name_map_S1480C4[] = {
  NSPAIR(_ZN7S1480C4C1Ev),
  NSPAIR(_ZN7S1480C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1480C4[];
extern void _ZN7S1480C4D1Ev();
extern void _ZN7S1480C4D0Ev();
extern void _ZN7S1480C42v5Ev();
extern void _ZN7S1480C42v6Ev();
extern void _ZN7S1480C42v7Ev();
extern void _ZN7S1480C42v8Ev();
extern void _ZN7S1480C42v9Ev();
extern void _ZN7S1480C43v10Ev();
extern void _ZN7S1480C43v11Ev();
extern void _ZN7S1480C43v12Ev();
extern void _ZN7S1480C43v13Ev();
extern void _ZN7S1480C43v14Ev();
static  VTBL_ENTRY vtc_S1480C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1480C4[0]),
  (VTBL_ENTRY)&_ZN7S1480C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1480C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1480C4[];
extern  VTBL_ENTRY _ZTV7S1480C4[];
Class_Descriptor cd_S1480C4 = {  "S1480C4", // class name
  0,0,//no base classes
  &(vtc_S1480C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1480C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1480C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1480C3  : S1480C4 {
  void *s1480c3f0;
  ::S10103C13_nt s1480c3f1;
  ::S10103C13_nt s1480c3f2;
  ::S10103C13_nt s1480c3f3;
  ::S10103C86 s1480c3f4;
  ::S10103C86 s1480c3f5;
  ::S10103C86 s1480c3f6;
  virtual  ~S1480C3(); // _ZN7S1480C3D1Ev
  virtual void  v15(); // _ZN7S1480C33v15Ev
  virtual void  v16(); // _ZN7S1480C33v16Ev
  virtual void  v17(); // _ZN7S1480C33v17Ev
  virtual void  v18(); // _ZN7S1480C33v18Ev
  virtual void  v19(); // _ZN7S1480C33v19Ev
  S1480C3(); // tgen
};
//SIG(-1 S1480C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1480C3 ::~S1480C3(){ note_dtor("S1480C3", this);}
void  S1480C3 ::v15(){vfunc_called(this, "_ZN7S1480C33v15Ev");}
void  S1480C3 ::v16(){vfunc_called(this, "_ZN7S1480C33v16Ev");}
void  S1480C3 ::v17(){vfunc_called(this, "_ZN7S1480C33v17Ev");}
void  S1480C3 ::v18(){vfunc_called(this, "_ZN7S1480C33v18Ev");}
void  S1480C3 ::v19(){vfunc_called(this, "_ZN7S1480C33v19Ev");}
S1480C3 ::S1480C3(){ note_ctor("S1480C3", this);} // tgen

static void Test_S1480C3()
{
  extern Class_Descriptor cd_S1480C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1480C3, buf);
    S1480C3 *dp, &lv = *(dp=new (buf) S1480C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1480C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1480C3)");
    check_base_class_offset(lv, (S1480C4*), 0, "S1480C3");
    check_field_offset(lv, s1480c3f0, ABISELECT(56,32), "S1480C3.s1480c3f0");
    check_field_offset(lv, s1480c3f1, ABISELECT(64,36), "S1480C3.s1480c3f1");
    check_field_offset(lv, s1480c3f2, ABISELECT(88,52), "S1480C3.s1480c3f2");
    check_field_offset(lv, s1480c3f3, ABISELECT(112,68), "S1480C3.s1480c3f3");
    check_field_offset(lv, s1480c3f4, ABISELECT(136,84), "S1480C3.s1480c3f4");
    check_field_offset(lv, s1480c3f5, ABISELECT(152,96), "S1480C3.s1480c3f5");
    check_field_offset(lv, s1480c3f6, ABISELECT(168,108), "S1480C3.s1480c3f6");
    test_class_info(&lv, &cd_S1480C3);
    dp->~S1480C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1480C3(Test_S1480C3, "S1480C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1480C3C1Ev();
extern void _ZN7S1480C3D1Ev();
Name_Map name_map_S1480C3[] = {
  NSPAIR(_ZN7S1480C3C1Ev),
  NSPAIR(_ZN7S1480C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1480C4;
extern VTBL_ENTRY _ZTI7S1480C4[];
extern  VTBL_ENTRY _ZTV7S1480C4[];
static Base_Class bases_S1480C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1480C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1480C3[];
extern void _ZN7S1480C3D1Ev();
extern void _ZN7S1480C3D0Ev();
extern void _ZN7S1480C42v5Ev();
extern void _ZN7S1480C42v6Ev();
extern void _ZN7S1480C42v7Ev();
extern void _ZN7S1480C42v8Ev();
extern void _ZN7S1480C42v9Ev();
extern void _ZN7S1480C43v10Ev();
extern void _ZN7S1480C43v11Ev();
extern void _ZN7S1480C43v12Ev();
extern void _ZN7S1480C43v13Ev();
extern void _ZN7S1480C43v14Ev();
extern void _ZN7S1480C33v15Ev();
extern void _ZN7S1480C33v16Ev();
extern void _ZN7S1480C33v17Ev();
extern void _ZN7S1480C33v18Ev();
extern void _ZN7S1480C33v19Ev();
static  VTBL_ENTRY vtc_S1480C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1480C3[0]),
  (VTBL_ENTRY)&_ZN7S1480C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1480C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1480C3[];
extern  VTBL_ENTRY _ZTV7S1480C3[];
Class_Descriptor cd_S1480C3 = {  "S1480C3", // class name
  bases_S1480C3, 1,
  &(vtc_S1480C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1480C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1480C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1480C2  : S1480C3 {
  int s1480c2f0[2];
  char s1480c2f1;
  int s1480c2f2[2];
  ::S10103C13_nt s1480c2f3;
  ::S10103C13_nt s1480c2f4;
  virtual void  v20(); // _ZN7S1480C23v20Ev
  virtual void  v21(); // _ZN7S1480C23v21Ev
  virtual void  v22(); // _ZN7S1480C23v22Ev
  virtual void  v23(); // _ZN7S1480C23v23Ev
  ~S1480C2(); // tgen
  S1480C2(); // tgen
};
//SIG(-1 S1480C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fi[2] Fc Fi[2] FC4 FC4}


void  S1480C2 ::v20(){vfunc_called(this, "_ZN7S1480C23v20Ev");}
void  S1480C2 ::v21(){vfunc_called(this, "_ZN7S1480C23v21Ev");}
void  S1480C2 ::v22(){vfunc_called(this, "_ZN7S1480C23v22Ev");}
void  S1480C2 ::v23(){vfunc_called(this, "_ZN7S1480C23v23Ev");}
S1480C2 ::~S1480C2(){ note_dtor("S1480C2", this);} // tgen
S1480C2 ::S1480C2(){ note_ctor("S1480C2", this);} // tgen

static void Test_S1480C2()
{
  extern Class_Descriptor cd_S1480C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,44)];
    init_test(&cd_S1480C2, buf);
    S1480C2 *dp, &lv = *(dp=new (buf) S1480C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,172), "sizeof(S1480C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1480C2)");
    check_base_class_offset(lv, (S1480C4*)(S1480C3*), 0, "S1480C2");
    check_base_class_offset(lv, (S1480C3*), 0, "S1480C2");
    check_field_offset(lv, s1480c2f0, ABISELECT(184,120), "S1480C2.s1480c2f0");
    check_field_offset(lv, s1480c2f1, ABISELECT(192,128), "S1480C2.s1480c2f1");
    check_field_offset(lv, s1480c2f2, ABISELECT(196,132), "S1480C2.s1480c2f2");
    check_field_offset(lv, s1480c2f3, ABISELECT(208,140), "S1480C2.s1480c2f3");
    check_field_offset(lv, s1480c2f4, ABISELECT(232,156), "S1480C2.s1480c2f4");
    test_class_info(&lv, &cd_S1480C2);
    dp->~S1480C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1480C2(Test_S1480C2, "S1480C2", ABISELECT(256,172));

#else // __cplusplus

extern void _ZN7S1480C2C1Ev();
extern void _ZN7S1480C2D1Ev();
Name_Map name_map_S1480C2[] = {
  NSPAIR(_ZN7S1480C2C1Ev),
  NSPAIR(_ZN7S1480C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1480C4;
extern VTBL_ENTRY _ZTI7S1480C4[];
extern  VTBL_ENTRY _ZTV7S1480C4[];
extern Class_Descriptor cd_S1480C3;
extern VTBL_ENTRY _ZTI7S1480C3[];
extern  VTBL_ENTRY _ZTV7S1480C3[];
static Base_Class bases_S1480C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1480C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1480C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1480C2[];
extern void _ZN7S1480C2D1Ev();
extern void _ZN7S1480C2D0Ev();
extern void _ZN7S1480C42v5Ev();
extern void _ZN7S1480C42v6Ev();
extern void _ZN7S1480C42v7Ev();
extern void _ZN7S1480C42v8Ev();
extern void _ZN7S1480C42v9Ev();
extern void _ZN7S1480C43v10Ev();
extern void _ZN7S1480C43v11Ev();
extern void _ZN7S1480C43v12Ev();
extern void _ZN7S1480C43v13Ev();
extern void _ZN7S1480C43v14Ev();
extern void _ZN7S1480C33v15Ev();
extern void _ZN7S1480C33v16Ev();
extern void _ZN7S1480C33v17Ev();
extern void _ZN7S1480C33v18Ev();
extern void _ZN7S1480C33v19Ev();
extern void _ZN7S1480C23v20Ev();
extern void _ZN7S1480C23v21Ev();
extern void _ZN7S1480C23v22Ev();
extern void _ZN7S1480C23v23Ev();
static  VTBL_ENTRY vtc_S1480C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1480C2[0]),
  (VTBL_ENTRY)&_ZN7S1480C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1480C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1480C2[];
extern  VTBL_ENTRY _ZTV7S1480C2[];
Class_Descriptor cd_S1480C2 = {  "S1480C2", // class name
  bases_S1480C2, 2,
  &(vtc_S1480C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,172), // object size
  NSPAIRA(_ZTI7S1480C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1480C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1480C1  : S1480C2 {
  virtual void  v1(); // _ZN7S1480C12v1Ev
  virtual void  v2(); // _ZN7S1480C12v2Ev
  virtual void  v3(); // _ZN7S1480C12v3Ev
  virtual void  v4(); // _ZN7S1480C12v4Ev
  ~S1480C1(); // tgen
  S1480C1(); // tgen
};
//SIG(1 S1480C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fi[2] Fc Fi[2] FC5 FC5} v1 v2 v3 v4}


void  S1480C1 ::v1(){vfunc_called(this, "_ZN7S1480C12v1Ev");}
void  S1480C1 ::v2(){vfunc_called(this, "_ZN7S1480C12v2Ev");}
void  S1480C1 ::v3(){vfunc_called(this, "_ZN7S1480C12v3Ev");}
void  S1480C1 ::v4(){vfunc_called(this, "_ZN7S1480C12v4Ev");}
S1480C1 ::~S1480C1(){ note_dtor("S1480C1", this);} // tgen
S1480C1 ::S1480C1(){ note_ctor("S1480C1", this);} // tgen

static void Test_S1480C1()
{
  extern Class_Descriptor cd_S1480C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,44)];
    init_test(&cd_S1480C1, buf);
    S1480C1 *dp, &lv = *(dp=new (buf) S1480C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,172), "sizeof(S1480C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1480C1)");
    check_base_class_offset(lv, (S1480C4*)(S1480C3*)(S1480C2*), 0, "S1480C1");
    check_base_class_offset(lv, (S1480C3*)(S1480C2*), 0, "S1480C1");
    check_base_class_offset(lv, (S1480C2*), 0, "S1480C1");
    test_class_info(&lv, &cd_S1480C1);
    dp->~S1480C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1480C1(Test_S1480C1, "S1480C1", ABISELECT(256,172));

#else // __cplusplus

extern void _ZN7S1480C1C1Ev();
extern void _ZN7S1480C1D1Ev();
Name_Map name_map_S1480C1[] = {
  NSPAIR(_ZN7S1480C1C1Ev),
  NSPAIR(_ZN7S1480C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1480C4;
extern VTBL_ENTRY _ZTI7S1480C4[];
extern  VTBL_ENTRY _ZTV7S1480C4[];
extern Class_Descriptor cd_S1480C3;
extern VTBL_ENTRY _ZTI7S1480C3[];
extern  VTBL_ENTRY _ZTV7S1480C3[];
extern Class_Descriptor cd_S1480C2;
extern VTBL_ENTRY _ZTI7S1480C2[];
extern  VTBL_ENTRY _ZTV7S1480C2[];
static Base_Class bases_S1480C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1480C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1480C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1480C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1480C1[];
extern void _ZN7S1480C1D1Ev();
extern void _ZN7S1480C1D0Ev();
extern void _ZN7S1480C42v5Ev();
extern void _ZN7S1480C42v6Ev();
extern void _ZN7S1480C42v7Ev();
extern void _ZN7S1480C42v8Ev();
extern void _ZN7S1480C42v9Ev();
extern void _ZN7S1480C43v10Ev();
extern void _ZN7S1480C43v11Ev();
extern void _ZN7S1480C43v12Ev();
extern void _ZN7S1480C43v13Ev();
extern void _ZN7S1480C43v14Ev();
extern void _ZN7S1480C33v15Ev();
extern void _ZN7S1480C33v16Ev();
extern void _ZN7S1480C33v17Ev();
extern void _ZN7S1480C33v18Ev();
extern void _ZN7S1480C33v19Ev();
extern void _ZN7S1480C23v20Ev();
extern void _ZN7S1480C23v21Ev();
extern void _ZN7S1480C23v22Ev();
extern void _ZN7S1480C23v23Ev();
extern void _ZN7S1480C12v1Ev();
extern void _ZN7S1480C12v2Ev();
extern void _ZN7S1480C12v3Ev();
extern void _ZN7S1480C12v4Ev();
static  VTBL_ENTRY vtc_S1480C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1480C1[0]),
  (VTBL_ENTRY)&_ZN7S1480C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1480C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1480C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1480C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1480C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1480C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1480C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1480C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1480C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1480C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1480C1[];
extern  VTBL_ENTRY _ZTV7S1480C1[];
Class_Descriptor cd_S1480C1 = {  "S1480C1", // class name
  bases_S1480C1, 3,
  &(vtc_S1480C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,172), // object size
  NSPAIRA(_ZTI7S1480C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1480C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3314C3  {
  void *s3314c3f0[2];
  ::S10103C13_nt s3314c3f1;
  void *s3314c3f2;
  virtual  ~S3314C3(); // _ZN7S3314C3D1Ev
  virtual void  v5(); // _ZN7S3314C32v5Ev
  virtual void  v6(); // _ZN7S3314C32v6Ev
  virtual void  v7(); // _ZN7S3314C32v7Ev
  virtual void  v8(); // _ZN7S3314C32v8Ev
  virtual void  v9(); // _ZN7S3314C32v9Ev
  virtual void  v10(); // _ZN7S3314C33v10Ev
  virtual void  v11(); // _ZN7S3314C33v11Ev
  virtual void  v12(); // _ZN7S3314C33v12Ev
  virtual void  v13(); // _ZN7S3314C33v13Ev
  virtual void  v14(); // _ZN7S3314C33v14Ev
  S3314C3(); // tgen
};
//SIG(-1 S3314C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3314C3 ::~S3314C3(){ note_dtor("S3314C3", this);}
void  S3314C3 ::v5(){vfunc_called(this, "_ZN7S3314C32v5Ev");}
void  S3314C3 ::v6(){vfunc_called(this, "_ZN7S3314C32v6Ev");}
void  S3314C3 ::v7(){vfunc_called(this, "_ZN7S3314C32v7Ev");}
void  S3314C3 ::v8(){vfunc_called(this, "_ZN7S3314C32v8Ev");}
void  S3314C3 ::v9(){vfunc_called(this, "_ZN7S3314C32v9Ev");}
void  S3314C3 ::v10(){vfunc_called(this, "_ZN7S3314C33v10Ev");}
void  S3314C3 ::v11(){vfunc_called(this, "_ZN7S3314C33v11Ev");}
void  S3314C3 ::v12(){vfunc_called(this, "_ZN7S3314C33v12Ev");}
void  S3314C3 ::v13(){vfunc_called(this, "_ZN7S3314C33v13Ev");}
void  S3314C3 ::v14(){vfunc_called(this, "_ZN7S3314C33v14Ev");}
S3314C3 ::S3314C3(){ note_ctor("S3314C3", this);} // tgen

static void Test_S3314C3()
{
  extern Class_Descriptor cd_S3314C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3314C3, buf);
    S3314C3 *dp, &lv = *(dp=new (buf) S3314C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3314C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3314C3)");
    check_field_offset(lv, s3314c3f0, ABISELECT(8,4), "S3314C3.s3314c3f0");
    check_field_offset(lv, s3314c3f1, ABISELECT(24,12), "S3314C3.s3314c3f1");
    check_field_offset(lv, s3314c3f2, ABISELECT(48,28), "S3314C3.s3314c3f2");
    test_class_info(&lv, &cd_S3314C3);
    dp->~S3314C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3314C3(Test_S3314C3, "S3314C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3314C3C1Ev();
extern void _ZN7S3314C3D1Ev();
Name_Map name_map_S3314C3[] = {
  NSPAIR(_ZN7S3314C3C1Ev),
  NSPAIR(_ZN7S3314C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3314C3[];
extern void _ZN7S3314C3D1Ev();
extern void _ZN7S3314C3D0Ev();
extern void _ZN7S3314C32v5Ev();
extern void _ZN7S3314C32v6Ev();
extern void _ZN7S3314C32v7Ev();
extern void _ZN7S3314C32v8Ev();
extern void _ZN7S3314C32v9Ev();
extern void _ZN7S3314C33v10Ev();
extern void _ZN7S3314C33v11Ev();
extern void _ZN7S3314C33v12Ev();
extern void _ZN7S3314C33v13Ev();
extern void _ZN7S3314C33v14Ev();
static  VTBL_ENTRY vtc_S3314C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3314C3[0]),
  (VTBL_ENTRY)&_ZN7S3314C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3314C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3314C3[];
extern  VTBL_ENTRY _ZTV7S3314C3[];
Class_Descriptor cd_S3314C3 = {  "S3314C3", // class name
  0,0,//no base classes
  &(vtc_S3314C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3314C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3314C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3314C2  : S3314C3 {
  void *s3314c2f0;
  ::S10103C13_nt s3314c2f1;
  ::S10103C13_nt s3314c2f2;
  ::S10103C13_nt s3314c2f3;
  ::S10103C86 s3314c2f4;
  ::S10103C86 s3314c2f5;
  ::S10103C86 s3314c2f6;
  virtual  ~S3314C2(); // _ZN7S3314C2D1Ev
  virtual void  v15(); // _ZN7S3314C23v15Ev
  virtual void  v16(); // _ZN7S3314C23v16Ev
  virtual void  v17(); // _ZN7S3314C23v17Ev
  virtual void  v18(); // _ZN7S3314C23v18Ev
  virtual void  v19(); // _ZN7S3314C23v19Ev
  S3314C2(); // tgen
};
//SIG(-1 S3314C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3314C2 ::~S3314C2(){ note_dtor("S3314C2", this);}
void  S3314C2 ::v15(){vfunc_called(this, "_ZN7S3314C23v15Ev");}
void  S3314C2 ::v16(){vfunc_called(this, "_ZN7S3314C23v16Ev");}
void  S3314C2 ::v17(){vfunc_called(this, "_ZN7S3314C23v17Ev");}
void  S3314C2 ::v18(){vfunc_called(this, "_ZN7S3314C23v18Ev");}
void  S3314C2 ::v19(){vfunc_called(this, "_ZN7S3314C23v19Ev");}
S3314C2 ::S3314C2(){ note_ctor("S3314C2", this);} // tgen

static void Test_S3314C2()
{
  extern Class_Descriptor cd_S3314C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3314C2, buf);
    S3314C2 *dp, &lv = *(dp=new (buf) S3314C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3314C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3314C2)");
    check_base_class_offset(lv, (S3314C3*), 0, "S3314C2");
    check_field_offset(lv, s3314c2f0, ABISELECT(56,32), "S3314C2.s3314c2f0");
    check_field_offset(lv, s3314c2f1, ABISELECT(64,36), "S3314C2.s3314c2f1");
    check_field_offset(lv, s3314c2f2, ABISELECT(88,52), "S3314C2.s3314c2f2");
    check_field_offset(lv, s3314c2f3, ABISELECT(112,68), "S3314C2.s3314c2f3");
    check_field_offset(lv, s3314c2f4, ABISELECT(136,84), "S3314C2.s3314c2f4");
    check_field_offset(lv, s3314c2f5, ABISELECT(152,96), "S3314C2.s3314c2f5");
    check_field_offset(lv, s3314c2f6, ABISELECT(168,108), "S3314C2.s3314c2f6");
    test_class_info(&lv, &cd_S3314C2);
    dp->~S3314C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3314C2(Test_S3314C2, "S3314C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3314C2C1Ev();
extern void _ZN7S3314C2D1Ev();
Name_Map name_map_S3314C2[] = {
  NSPAIR(_ZN7S3314C2C1Ev),
  NSPAIR(_ZN7S3314C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3314C3;
extern VTBL_ENTRY _ZTI7S3314C3[];
extern  VTBL_ENTRY _ZTV7S3314C3[];
static Base_Class bases_S3314C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3314C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3314C2[];
extern void _ZN7S3314C2D1Ev();
extern void _ZN7S3314C2D0Ev();
extern void _ZN7S3314C32v5Ev();
extern void _ZN7S3314C32v6Ev();
extern void _ZN7S3314C32v7Ev();
extern void _ZN7S3314C32v8Ev();
extern void _ZN7S3314C32v9Ev();
extern void _ZN7S3314C33v10Ev();
extern void _ZN7S3314C33v11Ev();
extern void _ZN7S3314C33v12Ev();
extern void _ZN7S3314C33v13Ev();
extern void _ZN7S3314C33v14Ev();
extern void _ZN7S3314C23v15Ev();
extern void _ZN7S3314C23v16Ev();
extern void _ZN7S3314C23v17Ev();
extern void _ZN7S3314C23v18Ev();
extern void _ZN7S3314C23v19Ev();
static  VTBL_ENTRY vtc_S3314C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3314C2[0]),
  (VTBL_ENTRY)&_ZN7S3314C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3314C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3314C2[];
extern  VTBL_ENTRY _ZTV7S3314C2[];
Class_Descriptor cd_S3314C2 = {  "S3314C2", // class name
  bases_S3314C2, 1,
  &(vtc_S3314C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3314C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3314C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3314C1  : S3314C2 {
  int s3314c1f0;
  ::S10103C82_nt s3314c1f1;
  int s3314c1f2[9];
  ::S10103C13_nt s3314c1f3[3];
  virtual  ~S3314C1(); // _ZN7S3314C1D1Ev
  virtual void  v1(); // _ZN7S3314C12v1Ev
  virtual void  v2(); // _ZN7S3314C12v2Ev
  virtual void  v3(); // _ZN7S3314C12v3Ev
  virtual void  v4(); // _ZN7S3314C12v4Ev
  S3314C1(); // tgen
};
//SIG(1 S3314C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 Fi FC10{ m FC11{ m FL[2]}} Fi[9] FC4[3]}


 S3314C1 ::~S3314C1(){ note_dtor("S3314C1", this);}
void  S3314C1 ::v1(){vfunc_called(this, "_ZN7S3314C12v1Ev");}
void  S3314C1 ::v2(){vfunc_called(this, "_ZN7S3314C12v2Ev");}
void  S3314C1 ::v3(){vfunc_called(this, "_ZN7S3314C12v3Ev");}
void  S3314C1 ::v4(){vfunc_called(this, "_ZN7S3314C12v4Ev");}
S3314C1 ::S3314C1(){ note_ctor("S3314C1", this);} // tgen

static void Test_S3314C1()
{
  extern Class_Descriptor cd_S3314C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(41,57)];
    init_test(&cd_S3314C1, buf);
    S3314C1 *dp, &lv = *(dp=new (buf) S3314C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(320,224), "sizeof(S3314C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3314C1)");
    check_base_class_offset(lv, (S3314C3*)(S3314C2*), 0, "S3314C1");
    check_base_class_offset(lv, (S3314C2*), 0, "S3314C1");
    check_field_offset(lv, s3314c1f0, ABISELECT(184,120), "S3314C1.s3314c1f0");
    check_field_offset(lv, s3314c1f1, ABISELECT(192,124), "S3314C1.s3314c1f1");
    check_field_offset(lv, s3314c1f2, ABISELECT(208,140), "S3314C1.s3314c1f2");
    check_field_offset(lv, s3314c1f3, ABISELECT(248,176), "S3314C1.s3314c1f3");
    test_class_info(&lv, &cd_S3314C1);
    dp->~S3314C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3314C1(Test_S3314C1, "S3314C1", ABISELECT(320,224));

#else // __cplusplus

extern void _ZN7S3314C1C1Ev();
extern void _ZN7S3314C1D1Ev();
Name_Map name_map_S3314C1[] = {
  NSPAIR(_ZN7S3314C1C1Ev),
  NSPAIR(_ZN7S3314C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3314C3;
extern VTBL_ENTRY _ZTI7S3314C3[];
extern  VTBL_ENTRY _ZTV7S3314C3[];
extern Class_Descriptor cd_S3314C2;
extern VTBL_ENTRY _ZTI7S3314C2[];
extern  VTBL_ENTRY _ZTV7S3314C2[];
static Base_Class bases_S3314C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3314C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3314C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3314C1[];
extern void _ZN7S3314C1D1Ev();
extern void _ZN7S3314C1D0Ev();
extern void _ZN7S3314C32v5Ev();
extern void _ZN7S3314C32v6Ev();
extern void _ZN7S3314C32v7Ev();
extern void _ZN7S3314C32v8Ev();
extern void _ZN7S3314C32v9Ev();
extern void _ZN7S3314C33v10Ev();
extern void _ZN7S3314C33v11Ev();
extern void _ZN7S3314C33v12Ev();
extern void _ZN7S3314C33v13Ev();
extern void _ZN7S3314C33v14Ev();
extern void _ZN7S3314C23v15Ev();
extern void _ZN7S3314C23v16Ev();
extern void _ZN7S3314C23v17Ev();
extern void _ZN7S3314C23v18Ev();
extern void _ZN7S3314C23v19Ev();
extern void _ZN7S3314C12v1Ev();
extern void _ZN7S3314C12v2Ev();
extern void _ZN7S3314C12v3Ev();
extern void _ZN7S3314C12v4Ev();
static  VTBL_ENTRY vtc_S3314C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3314C1[0]),
  (VTBL_ENTRY)&_ZN7S3314C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3314C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3314C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3314C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3314C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3314C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3314C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3314C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3314C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3314C1[];
extern  VTBL_ENTRY _ZTV7S3314C1[];
Class_Descriptor cd_S3314C1 = {  "S3314C1", // class name
  bases_S3314C1, 2,
  &(vtc_S3314C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(320,224), // object size
  NSPAIRA(_ZTI7S3314C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3314C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S504C5  {
  void *s504c5f0[2];
  ::S10103C13_nt s504c5f1;
  void *s504c5f2;
  virtual  ~S504C5(); // _ZN6S504C5D1Ev
  virtual void  v2(); // _ZN6S504C52v2Ev
  virtual void  v3(); // _ZN6S504C52v3Ev
  virtual void  v4(); // _ZN6S504C52v4Ev
  virtual void  v5(); // _ZN6S504C52v5Ev
  virtual void  v6(); // _ZN6S504C52v6Ev
  virtual void  v7(); // _ZN6S504C52v7Ev
  virtual void  v8(); // _ZN6S504C52v8Ev
  virtual void  v9(); // _ZN6S504C52v9Ev
  virtual void  v10(); // _ZN6S504C53v10Ev
  virtual void  v11(); // _ZN6S504C53v11Ev
  S504C5(); // tgen
};
//SIG(-1 S504C5) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S504C5 ::~S504C5(){ note_dtor("S504C5", this);}
void  S504C5 ::v2(){vfunc_called(this, "_ZN6S504C52v2Ev");}
void  S504C5 ::v3(){vfunc_called(this, "_ZN6S504C52v3Ev");}
void  S504C5 ::v4(){vfunc_called(this, "_ZN6S504C52v4Ev");}
void  S504C5 ::v5(){vfunc_called(this, "_ZN6S504C52v5Ev");}
void  S504C5 ::v6(){vfunc_called(this, "_ZN6S504C52v6Ev");}
void  S504C5 ::v7(){vfunc_called(this, "_ZN6S504C52v7Ev");}
void  S504C5 ::v8(){vfunc_called(this, "_ZN6S504C52v8Ev");}
void  S504C5 ::v9(){vfunc_called(this, "_ZN6S504C52v9Ev");}
void  S504C5 ::v10(){vfunc_called(this, "_ZN6S504C53v10Ev");}
void  S504C5 ::v11(){vfunc_called(this, "_ZN6S504C53v11Ev");}
S504C5 ::S504C5(){ note_ctor("S504C5", this);} // tgen

static void Test_S504C5()
{
  extern Class_Descriptor cd_S504C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S504C5, buf);
    S504C5 *dp, &lv = *(dp=new (buf) S504C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S504C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S504C5)");
    check_field_offset(lv, s504c5f0, ABISELECT(8,4), "S504C5.s504c5f0");
    check_field_offset(lv, s504c5f1, ABISELECT(24,12), "S504C5.s504c5f1");
    check_field_offset(lv, s504c5f2, ABISELECT(48,28), "S504C5.s504c5f2");
    test_class_info(&lv, &cd_S504C5);
    dp->~S504C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS504C5(Test_S504C5, "S504C5", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6S504C5C1Ev();
extern void _ZN6S504C5D1Ev();
Name_Map name_map_S504C5[] = {
  NSPAIR(_ZN6S504C5C1Ev),
  NSPAIR(_ZN6S504C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI6S504C5[];
extern void _ZN6S504C5D1Ev();
extern void _ZN6S504C5D0Ev();
extern void _ZN6S504C52v2Ev();
extern void _ZN6S504C52v3Ev();
extern void _ZN6S504C52v4Ev();
extern void _ZN6S504C52v5Ev();
extern void _ZN6S504C52v6Ev();
extern void _ZN6S504C52v7Ev();
extern void _ZN6S504C52v8Ev();
extern void _ZN6S504C52v9Ev();
extern void _ZN6S504C53v10Ev();
extern void _ZN6S504C53v11Ev();
static  VTBL_ENTRY vtc_S504C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S504C5[0]),
  (VTBL_ENTRY)&_ZN6S504C5D1Ev,
  (VTBL_ENTRY)&_ZN6S504C5D0Ev,
  (VTBL_ENTRY)&_ZN6S504C52v2Ev,
  (VTBL_ENTRY)&_ZN6S504C52v3Ev,
  (VTBL_ENTRY)&_ZN6S504C52v4Ev,
  (VTBL_ENTRY)&_ZN6S504C52v5Ev,
  (VTBL_ENTRY)&_ZN6S504C52v6Ev,
  (VTBL_ENTRY)&_ZN6S504C52v7Ev,
  (VTBL_ENTRY)&_ZN6S504C52v8Ev,
  (VTBL_ENTRY)&_ZN6S504C52v9Ev,
  (VTBL_ENTRY)&_ZN6S504C53v10Ev,
  (VTBL_ENTRY)&_ZN6S504C53v11Ev,
};
extern VTBL_ENTRY _ZTI6S504C5[];
extern  VTBL_ENTRY _ZTV6S504C5[];
Class_Descriptor cd_S504C5 = {  "S504C5", // class name
  0,0,//no base classes
  &(vtc_S504C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6S504C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV6S504C5),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S504C4  : S504C5 {
  void *s504c4f0;
  ::S10103C13_nt s504c4f1;
  ::S10103C13_nt s504c4f2;
  ::S10103C13_nt s504c4f3;
  ::S10103C86 s504c4f4;
  ::S10103C86 s504c4f5;
  ::S10103C86 s504c4f6;
  virtual  ~S504C4(); // _ZN6S504C4D1Ev
  virtual void  v12(); // _ZN6S504C43v12Ev
  virtual void  v13(); // _ZN6S504C43v13Ev
  virtual void  v14(); // _ZN6S504C43v14Ev
  virtual void  v15(); // _ZN6S504C43v15Ev
  virtual void  v16(); // _ZN6S504C43v16Ev
  S504C4(); // tgen
};
//SIG(-1 S504C4) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S504C4 ::~S504C4(){ note_dtor("S504C4", this);}
void  S504C4 ::v12(){vfunc_called(this, "_ZN6S504C43v12Ev");}
void  S504C4 ::v13(){vfunc_called(this, "_ZN6S504C43v13Ev");}
void  S504C4 ::v14(){vfunc_called(this, "_ZN6S504C43v14Ev");}
void  S504C4 ::v15(){vfunc_called(this, "_ZN6S504C43v15Ev");}
void  S504C4 ::v16(){vfunc_called(this, "_ZN6S504C43v16Ev");}
S504C4 ::S504C4(){ note_ctor("S504C4", this);} // tgen

static void Test_S504C4()
{
  extern Class_Descriptor cd_S504C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S504C4, buf);
    S504C4 *dp, &lv = *(dp=new (buf) S504C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S504C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S504C4)");
    check_base_class_offset(lv, (S504C5*), 0, "S504C4");
    check_field_offset(lv, s504c4f0, ABISELECT(56,32), "S504C4.s504c4f0");
    check_field_offset(lv, s504c4f1, ABISELECT(64,36), "S504C4.s504c4f1");
    check_field_offset(lv, s504c4f2, ABISELECT(88,52), "S504C4.s504c4f2");
    check_field_offset(lv, s504c4f3, ABISELECT(112,68), "S504C4.s504c4f3");
    check_field_offset(lv, s504c4f4, ABISELECT(136,84), "S504C4.s504c4f4");
    check_field_offset(lv, s504c4f5, ABISELECT(152,96), "S504C4.s504c4f5");
    check_field_offset(lv, s504c4f6, ABISELECT(168,108), "S504C4.s504c4f6");
    test_class_info(&lv, &cd_S504C4);
    dp->~S504C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS504C4(Test_S504C4, "S504C4", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN6S504C4C1Ev();
extern void _ZN6S504C4D1Ev();
Name_Map name_map_S504C4[] = {
  NSPAIR(_ZN6S504C4C1Ev),
  NSPAIR(_ZN6S504C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S504C5;
extern VTBL_ENTRY _ZTI6S504C5[];
extern  VTBL_ENTRY _ZTV6S504C5[];
static Base_Class bases_S504C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S504C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S504C4[];
extern void _ZN6S504C4D1Ev();
extern void _ZN6S504C4D0Ev();
extern void _ZN6S504C52v2Ev();
extern void _ZN6S504C52v3Ev();
extern void _ZN6S504C52v4Ev();
extern void _ZN6S504C52v5Ev();
extern void _ZN6S504C52v6Ev();
extern void _ZN6S504C52v7Ev();
extern void _ZN6S504C52v8Ev();
extern void _ZN6S504C52v9Ev();
extern void _ZN6S504C53v10Ev();
extern void _ZN6S504C53v11Ev();
extern void _ZN6S504C43v12Ev();
extern void _ZN6S504C43v13Ev();
extern void _ZN6S504C43v14Ev();
extern void _ZN6S504C43v15Ev();
extern void _ZN6S504C43v16Ev();
static  VTBL_ENTRY vtc_S504C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S504C4[0]),
  (VTBL_ENTRY)&_ZN6S504C4D1Ev,
  (VTBL_ENTRY)&_ZN6S504C4D0Ev,
  (VTBL_ENTRY)&_ZN6S504C52v2Ev,
  (VTBL_ENTRY)&_ZN6S504C52v3Ev,
  (VTBL_ENTRY)&_ZN6S504C52v4Ev,
  (VTBL_ENTRY)&_ZN6S504C52v5Ev,
  (VTBL_ENTRY)&_ZN6S504C52v6Ev,
  (VTBL_ENTRY)&_ZN6S504C52v7Ev,
  (VTBL_ENTRY)&_ZN6S504C52v8Ev,
  (VTBL_ENTRY)&_ZN6S504C52v9Ev,
  (VTBL_ENTRY)&_ZN6S504C53v10Ev,
  (VTBL_ENTRY)&_ZN6S504C53v11Ev,
  (VTBL_ENTRY)&_ZN6S504C43v12Ev,
  (VTBL_ENTRY)&_ZN6S504C43v13Ev,
  (VTBL_ENTRY)&_ZN6S504C43v14Ev,
  (VTBL_ENTRY)&_ZN6S504C43v15Ev,
  (VTBL_ENTRY)&_ZN6S504C43v16Ev,
};
extern VTBL_ENTRY _ZTI6S504C4[];
extern  VTBL_ENTRY _ZTV6S504C4[];
Class_Descriptor cd_S504C4 = {  "S504C4", // class name
  bases_S504C4, 1,
  &(vtc_S504C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI6S504C4),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S504C4),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S504C3  : S504C4 {
  char s504c3f0;
  virtual void  v17(); // _ZN6S504C33v17Ev
  virtual void  v18(); // _ZN6S504C33v18Ev
  virtual void  v19(); // _ZN6S504C33v19Ev
  virtual void  v20(); // _ZN6S504C33v20Ev
  ~S504C3(); // tgen
  S504C3(); // tgen
};
//SIG(-1 S504C3) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S504C3 ::v17(){vfunc_called(this, "_ZN6S504C33v17Ev");}
void  S504C3 ::v18(){vfunc_called(this, "_ZN6S504C33v18Ev");}
void  S504C3 ::v19(){vfunc_called(this, "_ZN6S504C33v19Ev");}
void  S504C3 ::v20(){vfunc_called(this, "_ZN6S504C33v20Ev");}
S504C3 ::~S504C3(){ note_dtor("S504C3", this);} // tgen
S504C3 ::S504C3(){ note_ctor("S504C3", this);} // tgen

static void Test_S504C3()
{
  extern Class_Descriptor cd_S504C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S504C3, buf);
    S504C3 *dp, &lv = *(dp=new (buf) S504C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S504C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S504C3)");
    check_base_class_offset(lv, (S504C5*)(S504C4*), 0, "S504C3");
    check_base_class_offset(lv, (S504C4*), 0, "S504C3");
    check_field_offset(lv, s504c3f0, ABISELECT(184,120), "S504C3.s504c3f0");
    test_class_info(&lv, &cd_S504C3);
    dp->~S504C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS504C3(Test_S504C3, "S504C3", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN6S504C3C1Ev();
extern void _ZN6S504C3D1Ev();
Name_Map name_map_S504C3[] = {
  NSPAIR(_ZN6S504C3C1Ev),
  NSPAIR(_ZN6S504C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S504C5;
extern VTBL_ENTRY _ZTI6S504C5[];
extern  VTBL_ENTRY _ZTV6S504C5[];
extern Class_Descriptor cd_S504C4;
extern VTBL_ENTRY _ZTI6S504C4[];
extern  VTBL_ENTRY _ZTV6S504C4[];
static Base_Class bases_S504C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S504C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S504C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S504C3[];
extern void _ZN6S504C3D1Ev();
extern void _ZN6S504C3D0Ev();
extern void _ZN6S504C52v2Ev();
extern void _ZN6S504C52v3Ev();
extern void _ZN6S504C52v4Ev();
extern void _ZN6S504C52v5Ev();
extern void _ZN6S504C52v6Ev();
extern void _ZN6S504C52v7Ev();
extern void _ZN6S504C52v8Ev();
extern void _ZN6S504C52v9Ev();
extern void _ZN6S504C53v10Ev();
extern void _ZN6S504C53v11Ev();
extern void _ZN6S504C43v12Ev();
extern void _ZN6S504C43v13Ev();
extern void _ZN6S504C43v14Ev();
extern void _ZN6S504C43v15Ev();
extern void _ZN6S504C43v16Ev();
extern void _ZN6S504C33v17Ev();
extern void _ZN6S504C33v18Ev();
extern void _ZN6S504C33v19Ev();
extern void _ZN6S504C33v20Ev();
static  VTBL_ENTRY vtc_S504C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S504C3[0]),
  (VTBL_ENTRY)&_ZN6S504C3D1Ev,
  (VTBL_ENTRY)&_ZN6S504C3D0Ev,
  (VTBL_ENTRY)&_ZN6S504C52v2Ev,
  (VTBL_ENTRY)&_ZN6S504C52v3Ev,
  (VTBL_ENTRY)&_ZN6S504C52v4Ev,
  (VTBL_ENTRY)&_ZN6S504C52v5Ev,
  (VTBL_ENTRY)&_ZN6S504C52v6Ev,
  (VTBL_ENTRY)&_ZN6S504C52v7Ev,
  (VTBL_ENTRY)&_ZN6S504C52v8Ev,
  (VTBL_ENTRY)&_ZN6S504C52v9Ev,
  (VTBL_ENTRY)&_ZN6S504C53v10Ev,
  (VTBL_ENTRY)&_ZN6S504C53v11Ev,
  (VTBL_ENTRY)&_ZN6S504C43v12Ev,
  (VTBL_ENTRY)&_ZN6S504C43v13Ev,
  (VTBL_ENTRY)&_ZN6S504C43v14Ev,
  (VTBL_ENTRY)&_ZN6S504C43v15Ev,
  (VTBL_ENTRY)&_ZN6S504C43v16Ev,
  (VTBL_ENTRY)&_ZN6S504C33v17Ev,
  (VTBL_ENTRY)&_ZN6S504C33v18Ev,
  (VTBL_ENTRY)&_ZN6S504C33v19Ev,
  (VTBL_ENTRY)&_ZN6S504C33v20Ev,
};
extern VTBL_ENTRY _ZTI6S504C3[];
extern  VTBL_ENTRY _ZTV6S504C3[];
Class_Descriptor cd_S504C3 = {  "S504C3", // class name
  bases_S504C3, 2,
  &(vtc_S504C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI6S504C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S504C3),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S504C2  : S504C3 {
  char s504c2f0;
  int s504c2f1;
  virtual void  v21(); // _ZN6S504C23v21Ev
  virtual void  v22(); // _ZN6S504C23v22Ev
  virtual void  v23(); // _ZN6S504C23v23Ev
  virtual void  v24(); // _ZN6S504C23v24Ev
  ~S504C2(); // tgen
  S504C2(); // tgen
};
//SIG(-1 S504C2) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fc} v1 v2 v3 v4 Fc Fi}


void  S504C2 ::v21(){vfunc_called(this, "_ZN6S504C23v21Ev");}
void  S504C2 ::v22(){vfunc_called(this, "_ZN6S504C23v22Ev");}
void  S504C2 ::v23(){vfunc_called(this, "_ZN6S504C23v23Ev");}
void  S504C2 ::v24(){vfunc_called(this, "_ZN6S504C23v24Ev");}
S504C2 ::~S504C2(){ note_dtor("S504C2", this);} // tgen
S504C2 ::S504C2(){ note_ctor("S504C2", this);} // tgen

static void Test_S504C2()
{
  extern Class_Descriptor cd_S504C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S504C2, buf);
    S504C2 *dp, &lv = *(dp=new (buf) S504C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S504C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S504C2)");
    check_base_class_offset(lv, (S504C5*)(S504C4*)(S504C3*), 0, "S504C2");
    check_base_class_offset(lv, (S504C4*)(S504C3*), 0, "S504C2");
    check_base_class_offset(lv, (S504C3*), 0, "S504C2");
    check_field_offset(lv, s504c2f0, ABISELECT(185,121), "S504C2.s504c2f0");
    check_field_offset(lv, s504c2f1, ABISELECT(188,124), "S504C2.s504c2f1");
    test_class_info(&lv, &cd_S504C2);
    dp->~S504C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS504C2(Test_S504C2, "S504C2", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN6S504C2C1Ev();
extern void _ZN6S504C2D1Ev();
Name_Map name_map_S504C2[] = {
  NSPAIR(_ZN6S504C2C1Ev),
  NSPAIR(_ZN6S504C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S504C5;
extern VTBL_ENTRY _ZTI6S504C5[];
extern  VTBL_ENTRY _ZTV6S504C5[];
extern Class_Descriptor cd_S504C4;
extern VTBL_ENTRY _ZTI6S504C4[];
extern  VTBL_ENTRY _ZTV6S504C4[];
extern Class_Descriptor cd_S504C3;
extern VTBL_ENTRY _ZTI6S504C3[];
extern  VTBL_ENTRY _ZTV6S504C3[];
static Base_Class bases_S504C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S504C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S504C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S504C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S504C2[];
extern void _ZN6S504C2D1Ev();
extern void _ZN6S504C2D0Ev();
extern void _ZN6S504C52v2Ev();
extern void _ZN6S504C52v3Ev();
extern void _ZN6S504C52v4Ev();
extern void _ZN6S504C52v5Ev();
extern void _ZN6S504C52v6Ev();
extern void _ZN6S504C52v7Ev();
extern void _ZN6S504C52v8Ev();
extern void _ZN6S504C52v9Ev();
extern void _ZN6S504C53v10Ev();
extern void _ZN6S504C53v11Ev();
extern void _ZN6S504C43v12Ev();
extern void _ZN6S504C43v13Ev();
extern void _ZN6S504C43v14Ev();
extern void _ZN6S504C43v15Ev();
extern void _ZN6S504C43v16Ev();
extern void _ZN6S504C33v17Ev();
extern void _ZN6S504C33v18Ev();
extern void _ZN6S504C33v19Ev();
extern void _ZN6S504C33v20Ev();
extern void _ZN6S504C23v21Ev();
extern void _ZN6S504C23v22Ev();
extern void _ZN6S504C23v23Ev();
extern void _ZN6S504C23v24Ev();
static  VTBL_ENTRY vtc_S504C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S504C2[0]),
  (VTBL_ENTRY)&_ZN6S504C2D1Ev,
  (VTBL_ENTRY)&_ZN6S504C2D0Ev,
  (VTBL_ENTRY)&_ZN6S504C52v2Ev,
  (VTBL_ENTRY)&_ZN6S504C52v3Ev,
  (VTBL_ENTRY)&_ZN6S504C52v4Ev,
  (VTBL_ENTRY)&_ZN6S504C52v5Ev,
  (VTBL_ENTRY)&_ZN6S504C52v6Ev,
  (VTBL_ENTRY)&_ZN6S504C52v7Ev,
  (VTBL_ENTRY)&_ZN6S504C52v8Ev,
  (VTBL_ENTRY)&_ZN6S504C52v9Ev,
  (VTBL_ENTRY)&_ZN6S504C53v10Ev,
  (VTBL_ENTRY)&_ZN6S504C53v11Ev,
  (VTBL_ENTRY)&_ZN6S504C43v12Ev,
  (VTBL_ENTRY)&_ZN6S504C43v13Ev,
  (VTBL_ENTRY)&_ZN6S504C43v14Ev,
  (VTBL_ENTRY)&_ZN6S504C43v15Ev,
  (VTBL_ENTRY)&_ZN6S504C43v16Ev,
  (VTBL_ENTRY)&_ZN6S504C33v17Ev,
  (VTBL_ENTRY)&_ZN6S504C33v18Ev,
  (VTBL_ENTRY)&_ZN6S504C33v19Ev,
  (VTBL_ENTRY)&_ZN6S504C33v20Ev,
  (VTBL_ENTRY)&_ZN6S504C23v21Ev,
  (VTBL_ENTRY)&_ZN6S504C23v22Ev,
  (VTBL_ENTRY)&_ZN6S504C23v23Ev,
  (VTBL_ENTRY)&_ZN6S504C23v24Ev,
};
extern VTBL_ENTRY _ZTI6S504C2[];
extern  VTBL_ENTRY _ZTV6S504C2[];
Class_Descriptor cd_S504C2 = {  "S504C2", // class name
  bases_S504C2, 3,
  &(vtc_S504C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI6S504C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S504C2),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S504C1  : S504C2 {
  virtual void  v1(); // _ZN6S504C12v1Ev
  ~S504C1(); // tgen
  S504C1(); // tgen
};
//SIG(1 S504C1) C1{ BC2{ BC3{ BC4{ BC5{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC6{ m FC7{ m Fp Fi FC8{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 Fp FC6 FC6 FC6 FC9{ m Fp Fi FC10{ m} FC11{ m}} FC9 FC9} v17 v18 v19 v20 Fc} v21 v22 v23 v24 Fc Fi} v1}


void  S504C1 ::v1(){vfunc_called(this, "_ZN6S504C12v1Ev");}
S504C1 ::~S504C1(){ note_dtor("S504C1", this);} // tgen
S504C1 ::S504C1(){ note_ctor("S504C1", this);} // tgen

static void Test_S504C1()
{
  extern Class_Descriptor cd_S504C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S504C1, buf);
    S504C1 *dp, &lv = *(dp=new (buf) S504C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S504C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S504C1)");
    check_base_class_offset(lv, (S504C5*)(S504C4*)(S504C3*)(S504C2*), 0, "S504C1");
    check_base_class_offset(lv, (S504C4*)(S504C3*)(S504C2*), 0, "S504C1");
    check_base_class_offset(lv, (S504C3*)(S504C2*), 0, "S504C1");
    check_base_class_offset(lv, (S504C2*), 0, "S504C1");
    test_class_info(&lv, &cd_S504C1);
    dp->~S504C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS504C1(Test_S504C1, "S504C1", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN6S504C1C1Ev();
extern void _ZN6S504C1D1Ev();
Name_Map name_map_S504C1[] = {
  NSPAIR(_ZN6S504C1C1Ev),
  NSPAIR(_ZN6S504C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S504C5;
extern VTBL_ENTRY _ZTI6S504C5[];
extern  VTBL_ENTRY _ZTV6S504C5[];
extern Class_Descriptor cd_S504C4;
extern VTBL_ENTRY _ZTI6S504C4[];
extern  VTBL_ENTRY _ZTV6S504C4[];
extern Class_Descriptor cd_S504C3;
extern VTBL_ENTRY _ZTI6S504C3[];
extern  VTBL_ENTRY _ZTV6S504C3[];
extern Class_Descriptor cd_S504C2;
extern VTBL_ENTRY _ZTI6S504C2[];
extern  VTBL_ENTRY _ZTV6S504C2[];
static Base_Class bases_S504C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S504C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S504C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S504C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_S504C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6S504C1[];
extern void _ZN6S504C1D1Ev();
extern void _ZN6S504C1D0Ev();
extern void _ZN6S504C52v2Ev();
extern void _ZN6S504C52v3Ev();
extern void _ZN6S504C52v4Ev();
extern void _ZN6S504C52v5Ev();
extern void _ZN6S504C52v6Ev();
extern void _ZN6S504C52v7Ev();
extern void _ZN6S504C52v8Ev();
extern void _ZN6S504C52v9Ev();
extern void _ZN6S504C53v10Ev();
extern void _ZN6S504C53v11Ev();
extern void _ZN6S504C43v12Ev();
extern void _ZN6S504C43v13Ev();
extern void _ZN6S504C43v14Ev();
extern void _ZN6S504C43v15Ev();
extern void _ZN6S504C43v16Ev();
extern void _ZN6S504C33v17Ev();
extern void _ZN6S504C33v18Ev();
extern void _ZN6S504C33v19Ev();
extern void _ZN6S504C33v20Ev();
extern void _ZN6S504C23v21Ev();
extern void _ZN6S504C23v22Ev();
extern void _ZN6S504C23v23Ev();
extern void _ZN6S504C23v24Ev();
extern void _ZN6S504C12v1Ev();
static  VTBL_ENTRY vtc_S504C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6S504C1[0]),
  (VTBL_ENTRY)&_ZN6S504C1D1Ev,
  (VTBL_ENTRY)&_ZN6S504C1D0Ev,
  (VTBL_ENTRY)&_ZN6S504C52v2Ev,
  (VTBL_ENTRY)&_ZN6S504C52v3Ev,
  (VTBL_ENTRY)&_ZN6S504C52v4Ev,
  (VTBL_ENTRY)&_ZN6S504C52v5Ev,
  (VTBL_ENTRY)&_ZN6S504C52v6Ev,
  (VTBL_ENTRY)&_ZN6S504C52v7Ev,
  (VTBL_ENTRY)&_ZN6S504C52v8Ev,
  (VTBL_ENTRY)&_ZN6S504C52v9Ev,
  (VTBL_ENTRY)&_ZN6S504C53v10Ev,
  (VTBL_ENTRY)&_ZN6S504C53v11Ev,
  (VTBL_ENTRY)&_ZN6S504C43v12Ev,
  (VTBL_ENTRY)&_ZN6S504C43v13Ev,
  (VTBL_ENTRY)&_ZN6S504C43v14Ev,
  (VTBL_ENTRY)&_ZN6S504C43v15Ev,
  (VTBL_ENTRY)&_ZN6S504C43v16Ev,
  (VTBL_ENTRY)&_ZN6S504C33v17Ev,
  (VTBL_ENTRY)&_ZN6S504C33v18Ev,
  (VTBL_ENTRY)&_ZN6S504C33v19Ev,
  (VTBL_ENTRY)&_ZN6S504C33v20Ev,
  (VTBL_ENTRY)&_ZN6S504C23v21Ev,
  (VTBL_ENTRY)&_ZN6S504C23v22Ev,
  (VTBL_ENTRY)&_ZN6S504C23v23Ev,
  (VTBL_ENTRY)&_ZN6S504C23v24Ev,
  (VTBL_ENTRY)&_ZN6S504C12v1Ev,
};
extern VTBL_ENTRY _ZTI6S504C1[];
extern  VTBL_ENTRY _ZTV6S504C1[];
Class_Descriptor cd_S504C1 = {  "S504C1", // class name
  bases_S504C1, 4,
  &(vtc_S504C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI6S504C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6S504C1),28, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S7068C2  {
  void *s7068c2f0[2];
  ::S10103C13_nt s7068c2f1;
  void *s7068c2f2;
  virtual  ~S7068C2(); // _ZN7S7068C2D1Ev
  virtual void  v6(); // _ZN7S7068C22v6Ev
  virtual void  v7(); // _ZN7S7068C22v7Ev
  virtual void  v8(); // _ZN7S7068C22v8Ev
  virtual void  v9(); // _ZN7S7068C22v9Ev
  virtual void  v10(); // _ZN7S7068C23v10Ev
  virtual void  v11(); // _ZN7S7068C23v11Ev
  virtual void  v12(); // _ZN7S7068C23v12Ev
  virtual void  v13(); // _ZN7S7068C23v13Ev
  virtual void  v14(); // _ZN7S7068C23v14Ev
  virtual void  v15(); // _ZN7S7068C23v15Ev
  S7068C2(); // tgen
};
//SIG(-1 S7068C2) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S7068C2 ::~S7068C2(){ note_dtor("S7068C2", this);}
void  S7068C2 ::v6(){vfunc_called(this, "_ZN7S7068C22v6Ev");}
void  S7068C2 ::v7(){vfunc_called(this, "_ZN7S7068C22v7Ev");}
void  S7068C2 ::v8(){vfunc_called(this, "_ZN7S7068C22v8Ev");}
void  S7068C2 ::v9(){vfunc_called(this, "_ZN7S7068C22v9Ev");}
void  S7068C2 ::v10(){vfunc_called(this, "_ZN7S7068C23v10Ev");}
void  S7068C2 ::v11(){vfunc_called(this, "_ZN7S7068C23v11Ev");}
void  S7068C2 ::v12(){vfunc_called(this, "_ZN7S7068C23v12Ev");}
void  S7068C2 ::v13(){vfunc_called(this, "_ZN7S7068C23v13Ev");}
void  S7068C2 ::v14(){vfunc_called(this, "_ZN7S7068C23v14Ev");}
void  S7068C2 ::v15(){vfunc_called(this, "_ZN7S7068C23v15Ev");}
S7068C2 ::S7068C2(){ note_ctor("S7068C2", this);} // tgen

static void Test_S7068C2()
{
  extern Class_Descriptor cd_S7068C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S7068C2, buf);
    S7068C2 *dp, &lv = *(dp=new (buf) S7068C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S7068C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S7068C2)");
    check_field_offset(lv, s7068c2f0, ABISELECT(8,4), "S7068C2.s7068c2f0");
    check_field_offset(lv, s7068c2f1, ABISELECT(24,12), "S7068C2.s7068c2f1");
    check_field_offset(lv, s7068c2f2, ABISELECT(48,28), "S7068C2.s7068c2f2");
    test_class_info(&lv, &cd_S7068C2);
    dp->~S7068C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS7068C2(Test_S7068C2, "S7068C2", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S7068C2C1Ev();
extern void _ZN7S7068C2D1Ev();
Name_Map name_map_S7068C2[] = {
  NSPAIR(_ZN7S7068C2C1Ev),
  NSPAIR(_ZN7S7068C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S7068C2[];
extern void _ZN7S7068C2D1Ev();
extern void _ZN7S7068C2D0Ev();
extern void _ZN7S7068C22v6Ev();
extern void _ZN7S7068C22v7Ev();
extern void _ZN7S7068C22v8Ev();
extern void _ZN7S7068C22v9Ev();
extern void _ZN7S7068C23v10Ev();
extern void _ZN7S7068C23v11Ev();
extern void _ZN7S7068C23v12Ev();
extern void _ZN7S7068C23v13Ev();
extern void _ZN7S7068C23v14Ev();
extern void _ZN7S7068C23v15Ev();
static  VTBL_ENTRY vtc_S7068C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S7068C2[0]),
  (VTBL_ENTRY)&_ZN7S7068C2D1Ev,
  (VTBL_ENTRY)&_ZN7S7068C2D0Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v6Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v7Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v8Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v9Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v10Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v11Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v12Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v13Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v14Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v15Ev,
};
extern VTBL_ENTRY _ZTI7S7068C2[];
extern  VTBL_ENTRY _ZTV7S7068C2[];
Class_Descriptor cd_S7068C2 = {  "S7068C2", // class name
  0,0,//no base classes
  &(vtc_S7068C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S7068C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S7068C2),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S7068C1  : S7068C2 {
  void *s7068c1f0;
  char s7068c1f1[2];
  int s7068c1f2;
  ::S10103C13_nt s7068c1f3;
  ::S10103C13_nt s7068c1f4;
  ::S10103C13_nt s7068c1f5;
  ::S10103C13_nt s7068c1f6;
  int s7068c1f7;
  ::S10103C82_nt s7068c1f8;
  ::S10103C30_nt s7068c1f9;
  ::S10103C82_nt s7068c1f10;
  ::S10103C13_nt s7068c1f11;
  ::S679C21_nt s7068c1f12;
  void *s7068c1f13[3];
  int s7068c1f14[3];
  virtual  ~S7068C1(); // _ZN7S7068C1D1Ev
  virtual void  v1(); // _ZN7S7068C12v1Ev
  virtual void  v2(); // _ZN7S7068C12v2Ev
  virtual void  v3(); // _ZN7S7068C12v3Ev
  virtual void  v4(); // _ZN7S7068C12v4Ev
  virtual void  v5(); // _ZN7S7068C12v5Ev
  S7068C1(); // tgen
};
//SIG(1 S7068C1) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp Fc[2] Fi FC3 FC3 FC3 FC3 Fi FC6{ m FC7{ m FL[2]}} FC8{ m FC9{ m FL}} FC6 FC3 FC10{ m FC7} Fp[3] Fi[3]}


 S7068C1 ::~S7068C1(){ note_dtor("S7068C1", this);}
void  S7068C1 ::v1(){vfunc_called(this, "_ZN7S7068C12v1Ev");}
void  S7068C1 ::v2(){vfunc_called(this, "_ZN7S7068C12v2Ev");}
void  S7068C1 ::v3(){vfunc_called(this, "_ZN7S7068C12v3Ev");}
void  S7068C1 ::v4(){vfunc_called(this, "_ZN7S7068C12v4Ev");}
void  S7068C1 ::v5(){vfunc_called(this, "_ZN7S7068C12v5Ev");}
S7068C1 ::S7068C1(){ note_ctor("S7068C1", this);} // tgen

static void Test_S7068C1()
{
  extern Class_Descriptor cd_S7068C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(38,53)];
    init_test(&cd_S7068C1, buf);
    S7068C1 *dp, &lv = *(dp=new (buf) S7068C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(296,208), "sizeof(S7068C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S7068C1)");
    check_base_class_offset(lv, (S7068C2*), 0, "S7068C1");
    check_field_offset(lv, s7068c1f0, ABISELECT(56,32), "S7068C1.s7068c1f0");
    check_field_offset(lv, s7068c1f1, ABISELECT(64,36), "S7068C1.s7068c1f1");
    check_field_offset(lv, s7068c1f2, ABISELECT(68,40), "S7068C1.s7068c1f2");
    check_field_offset(lv, s7068c1f3, ABISELECT(72,44), "S7068C1.s7068c1f3");
    check_field_offset(lv, s7068c1f4, ABISELECT(96,60), "S7068C1.s7068c1f4");
    check_field_offset(lv, s7068c1f5, ABISELECT(120,76), "S7068C1.s7068c1f5");
    check_field_offset(lv, s7068c1f6, ABISELECT(144,92), "S7068C1.s7068c1f6");
    check_field_offset(lv, s7068c1f7, ABISELECT(168,108), "S7068C1.s7068c1f7");
    check_field_offset(lv, s7068c1f8, ABISELECT(176,112), "S7068C1.s7068c1f8");
    check_field_offset(lv, s7068c1f9, ABISELECT(192,128), "S7068C1.s7068c1f9");
    check_field_offset(lv, s7068c1f10, ABISELECT(200,136), "S7068C1.s7068c1f10");
    check_field_offset(lv, s7068c1f11, ABISELECT(216,152), "S7068C1.s7068c1f11");
    check_field_offset(lv, s7068c1f12, ABISELECT(240,168), "S7068C1.s7068c1f12");
    check_field_offset(lv, s7068c1f13, ABISELECT(256,184), "S7068C1.s7068c1f13");
    check_field_offset(lv, s7068c1f14, ABISELECT(280,196), "S7068C1.s7068c1f14");
    test_class_info(&lv, &cd_S7068C1);
    dp->~S7068C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS7068C1(Test_S7068C1, "S7068C1", ABISELECT(296,208));

#else // __cplusplus

extern void _ZN7S7068C1C1Ev();
extern void _ZN7S7068C1D1Ev();
Name_Map name_map_S7068C1[] = {
  NSPAIR(_ZN7S7068C1C1Ev),
  NSPAIR(_ZN7S7068C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S7068C2;
extern VTBL_ENTRY _ZTI7S7068C2[];
extern  VTBL_ENTRY _ZTV7S7068C2[];
static Base_Class bases_S7068C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S7068C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S7068C1[];
extern void _ZN7S7068C1D1Ev();
extern void _ZN7S7068C1D0Ev();
extern void _ZN7S7068C22v6Ev();
extern void _ZN7S7068C22v7Ev();
extern void _ZN7S7068C22v8Ev();
extern void _ZN7S7068C22v9Ev();
extern void _ZN7S7068C23v10Ev();
extern void _ZN7S7068C23v11Ev();
extern void _ZN7S7068C23v12Ev();
extern void _ZN7S7068C23v13Ev();
extern void _ZN7S7068C23v14Ev();
extern void _ZN7S7068C23v15Ev();
extern void _ZN7S7068C12v1Ev();
extern void _ZN7S7068C12v2Ev();
extern void _ZN7S7068C12v3Ev();
extern void _ZN7S7068C12v4Ev();
extern void _ZN7S7068C12v5Ev();
static  VTBL_ENTRY vtc_S7068C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S7068C1[0]),
  (VTBL_ENTRY)&_ZN7S7068C1D1Ev,
  (VTBL_ENTRY)&_ZN7S7068C1D0Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v6Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v7Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v8Ev,
  (VTBL_ENTRY)&_ZN7S7068C22v9Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v10Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v11Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v12Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v13Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v14Ev,
  (VTBL_ENTRY)&_ZN7S7068C23v15Ev,
  (VTBL_ENTRY)&_ZN7S7068C12v1Ev,
  (VTBL_ENTRY)&_ZN7S7068C12v2Ev,
  (VTBL_ENTRY)&_ZN7S7068C12v3Ev,
  (VTBL_ENTRY)&_ZN7S7068C12v4Ev,
  (VTBL_ENTRY)&_ZN7S7068C12v5Ev,
};
extern VTBL_ENTRY _ZTI7S7068C1[];
extern  VTBL_ENTRY _ZTV7S7068C1[];
Class_Descriptor cd_S7068C1 = {  "S7068C1", // class name
  bases_S7068C1, 1,
  &(vtc_S7068C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(296,208), // object size
  NSPAIRA(_ZTI7S7068C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S7068C1),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1344C4  {
  void *s1344c4f0[2];
  ::S10103C13_nt s1344c4f1;
  void *s1344c4f2;
  virtual  ~S1344C4(); // _ZN7S1344C4D1Ev
  virtual void  v2(); // _ZN7S1344C42v2Ev
  virtual void  v3(); // _ZN7S1344C42v3Ev
  virtual void  v4(); // _ZN7S1344C42v4Ev
  virtual void  v5(); // _ZN7S1344C42v5Ev
  virtual void  v6(); // _ZN7S1344C42v6Ev
  virtual void  v7(); // _ZN7S1344C42v7Ev
  virtual void  v8(); // _ZN7S1344C42v8Ev
  virtual void  v9(); // _ZN7S1344C42v9Ev
  virtual void  v10(); // _ZN7S1344C43v10Ev
  virtual void  v11(); // _ZN7S1344C43v11Ev
  S1344C4(); // tgen
};
//SIG(-1 S1344C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1344C4 ::~S1344C4(){ note_dtor("S1344C4", this);}
void  S1344C4 ::v2(){vfunc_called(this, "_ZN7S1344C42v2Ev");}
void  S1344C4 ::v3(){vfunc_called(this, "_ZN7S1344C42v3Ev");}
void  S1344C4 ::v4(){vfunc_called(this, "_ZN7S1344C42v4Ev");}
void  S1344C4 ::v5(){vfunc_called(this, "_ZN7S1344C42v5Ev");}
void  S1344C4 ::v6(){vfunc_called(this, "_ZN7S1344C42v6Ev");}
void  S1344C4 ::v7(){vfunc_called(this, "_ZN7S1344C42v7Ev");}
void  S1344C4 ::v8(){vfunc_called(this, "_ZN7S1344C42v8Ev");}
void  S1344C4 ::v9(){vfunc_called(this, "_ZN7S1344C42v9Ev");}
void  S1344C4 ::v10(){vfunc_called(this, "_ZN7S1344C43v10Ev");}
void  S1344C4 ::v11(){vfunc_called(this, "_ZN7S1344C43v11Ev");}
S1344C4 ::S1344C4(){ note_ctor("S1344C4", this);} // tgen

static void Test_S1344C4()
{
  extern Class_Descriptor cd_S1344C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1344C4, buf);
    S1344C4 *dp, &lv = *(dp=new (buf) S1344C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1344C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1344C4)");
    check_field_offset(lv, s1344c4f0, ABISELECT(8,4), "S1344C4.s1344c4f0");
    check_field_offset(lv, s1344c4f1, ABISELECT(24,12), "S1344C4.s1344c4f1");
    check_field_offset(lv, s1344c4f2, ABISELECT(48,28), "S1344C4.s1344c4f2");
    test_class_info(&lv, &cd_S1344C4);
    dp->~S1344C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1344C4(Test_S1344C4, "S1344C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1344C4C1Ev();
extern void _ZN7S1344C4D1Ev();
Name_Map name_map_S1344C4[] = {
  NSPAIR(_ZN7S1344C4C1Ev),
  NSPAIR(_ZN7S1344C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1344C4[];
extern void _ZN7S1344C4D1Ev();
extern void _ZN7S1344C4D0Ev();
extern void _ZN7S1344C42v2Ev();
extern void _ZN7S1344C42v3Ev();
extern void _ZN7S1344C42v4Ev();
extern void _ZN7S1344C42v5Ev();
extern void _ZN7S1344C42v6Ev();
extern void _ZN7S1344C42v7Ev();
extern void _ZN7S1344C42v8Ev();
extern void _ZN7S1344C42v9Ev();
extern void _ZN7S1344C43v10Ev();
extern void _ZN7S1344C43v11Ev();
static  VTBL_ENTRY vtc_S1344C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1344C4[0]),
  (VTBL_ENTRY)&_ZN7S1344C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1344C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v11Ev,
};
extern VTBL_ENTRY _ZTI7S1344C4[];
extern  VTBL_ENTRY _ZTV7S1344C4[];
Class_Descriptor cd_S1344C4 = {  "S1344C4", // class name
  0,0,//no base classes
  &(vtc_S1344C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1344C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1344C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1344C3  : S1344C4 {
  void *s1344c3f0;
  ::S10103C13_nt s1344c3f1;
  ::S10103C13_nt s1344c3f2;
  ::S10103C13_nt s1344c3f3;
  ::S10103C86 s1344c3f4;
  ::S10103C86 s1344c3f5;
  ::S10103C86 s1344c3f6;
  virtual  ~S1344C3(); // _ZN7S1344C3D1Ev
  virtual void  v12(); // _ZN7S1344C33v12Ev
  virtual void  v13(); // _ZN7S1344C33v13Ev
  virtual void  v14(); // _ZN7S1344C33v14Ev
  virtual void  v15(); // _ZN7S1344C33v15Ev
  virtual void  v16(); // _ZN7S1344C33v16Ev
  S1344C3(); // tgen
};
//SIG(-1 S1344C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1344C3 ::~S1344C3(){ note_dtor("S1344C3", this);}
void  S1344C3 ::v12(){vfunc_called(this, "_ZN7S1344C33v12Ev");}
void  S1344C3 ::v13(){vfunc_called(this, "_ZN7S1344C33v13Ev");}
void  S1344C3 ::v14(){vfunc_called(this, "_ZN7S1344C33v14Ev");}
void  S1344C3 ::v15(){vfunc_called(this, "_ZN7S1344C33v15Ev");}
void  S1344C3 ::v16(){vfunc_called(this, "_ZN7S1344C33v16Ev");}
S1344C3 ::S1344C3(){ note_ctor("S1344C3", this);} // tgen

static void Test_S1344C3()
{
  extern Class_Descriptor cd_S1344C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1344C3, buf);
    S1344C3 *dp, &lv = *(dp=new (buf) S1344C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1344C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1344C3)");
    check_base_class_offset(lv, (S1344C4*), 0, "S1344C3");
    check_field_offset(lv, s1344c3f0, ABISELECT(56,32), "S1344C3.s1344c3f0");
    check_field_offset(lv, s1344c3f1, ABISELECT(64,36), "S1344C3.s1344c3f1");
    check_field_offset(lv, s1344c3f2, ABISELECT(88,52), "S1344C3.s1344c3f2");
    check_field_offset(lv, s1344c3f3, ABISELECT(112,68), "S1344C3.s1344c3f3");
    check_field_offset(lv, s1344c3f4, ABISELECT(136,84), "S1344C3.s1344c3f4");
    check_field_offset(lv, s1344c3f5, ABISELECT(152,96), "S1344C3.s1344c3f5");
    check_field_offset(lv, s1344c3f6, ABISELECT(168,108), "S1344C3.s1344c3f6");
    test_class_info(&lv, &cd_S1344C3);
    dp->~S1344C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1344C3(Test_S1344C3, "S1344C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1344C3C1Ev();
extern void _ZN7S1344C3D1Ev();
Name_Map name_map_S1344C3[] = {
  NSPAIR(_ZN7S1344C3C1Ev),
  NSPAIR(_ZN7S1344C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1344C4;
extern VTBL_ENTRY _ZTI7S1344C4[];
extern  VTBL_ENTRY _ZTV7S1344C4[];
static Base_Class bases_S1344C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1344C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1344C3[];
extern void _ZN7S1344C3D1Ev();
extern void _ZN7S1344C3D0Ev();
extern void _ZN7S1344C42v2Ev();
extern void _ZN7S1344C42v3Ev();
extern void _ZN7S1344C42v4Ev();
extern void _ZN7S1344C42v5Ev();
extern void _ZN7S1344C42v6Ev();
extern void _ZN7S1344C42v7Ev();
extern void _ZN7S1344C42v8Ev();
extern void _ZN7S1344C42v9Ev();
extern void _ZN7S1344C43v10Ev();
extern void _ZN7S1344C43v11Ev();
extern void _ZN7S1344C33v12Ev();
extern void _ZN7S1344C33v13Ev();
extern void _ZN7S1344C33v14Ev();
extern void _ZN7S1344C33v15Ev();
extern void _ZN7S1344C33v16Ev();
static  VTBL_ENTRY vtc_S1344C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1344C3[0]),
  (VTBL_ENTRY)&_ZN7S1344C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1344C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v16Ev,
};
extern VTBL_ENTRY _ZTI7S1344C3[];
extern  VTBL_ENTRY _ZTV7S1344C3[];
Class_Descriptor cd_S1344C3 = {  "S1344C3", // class name
  bases_S1344C3, 1,
  &(vtc_S1344C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1344C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1344C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1344C2  : S1344C3 {
  int s1344c2f0[2];
  char s1344c2f1;
  int s1344c2f2[2];
  ::S10103C13_nt s1344c2f3;
  ::S10103C13_nt s1344c2f4;
  virtual void  v17(); // _ZN7S1344C23v17Ev
  virtual void  v18(); // _ZN7S1344C23v18Ev
  virtual void  v19(); // _ZN7S1344C23v19Ev
  virtual void  v20(); // _ZN7S1344C23v20Ev
  ~S1344C2(); // tgen
  S1344C2(); // tgen
};
//SIG(-1 S1344C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fi[2] Fc Fi[2] FC4 FC4}


void  S1344C2 ::v17(){vfunc_called(this, "_ZN7S1344C23v17Ev");}
void  S1344C2 ::v18(){vfunc_called(this, "_ZN7S1344C23v18Ev");}
void  S1344C2 ::v19(){vfunc_called(this, "_ZN7S1344C23v19Ev");}
void  S1344C2 ::v20(){vfunc_called(this, "_ZN7S1344C23v20Ev");}
S1344C2 ::~S1344C2(){ note_dtor("S1344C2", this);} // tgen
S1344C2 ::S1344C2(){ note_ctor("S1344C2", this);} // tgen

static void Test_S1344C2()
{
  extern Class_Descriptor cd_S1344C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,44)];
    init_test(&cd_S1344C2, buf);
    S1344C2 *dp, &lv = *(dp=new (buf) S1344C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,172), "sizeof(S1344C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1344C2)");
    check_base_class_offset(lv, (S1344C4*)(S1344C3*), 0, "S1344C2");
    check_base_class_offset(lv, (S1344C3*), 0, "S1344C2");
    check_field_offset(lv, s1344c2f0, ABISELECT(184,120), "S1344C2.s1344c2f0");
    check_field_offset(lv, s1344c2f1, ABISELECT(192,128), "S1344C2.s1344c2f1");
    check_field_offset(lv, s1344c2f2, ABISELECT(196,132), "S1344C2.s1344c2f2");
    check_field_offset(lv, s1344c2f3, ABISELECT(208,140), "S1344C2.s1344c2f3");
    check_field_offset(lv, s1344c2f4, ABISELECT(232,156), "S1344C2.s1344c2f4");
    test_class_info(&lv, &cd_S1344C2);
    dp->~S1344C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1344C2(Test_S1344C2, "S1344C2", ABISELECT(256,172));

#else // __cplusplus

extern void _ZN7S1344C2C1Ev();
extern void _ZN7S1344C2D1Ev();
Name_Map name_map_S1344C2[] = {
  NSPAIR(_ZN7S1344C2C1Ev),
  NSPAIR(_ZN7S1344C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1344C4;
extern VTBL_ENTRY _ZTI7S1344C4[];
extern  VTBL_ENTRY _ZTV7S1344C4[];
extern Class_Descriptor cd_S1344C3;
extern VTBL_ENTRY _ZTI7S1344C3[];
extern  VTBL_ENTRY _ZTV7S1344C3[];
static Base_Class bases_S1344C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1344C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1344C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1344C2[];
extern void _ZN7S1344C2D1Ev();
extern void _ZN7S1344C2D0Ev();
extern void _ZN7S1344C42v2Ev();
extern void _ZN7S1344C42v3Ev();
extern void _ZN7S1344C42v4Ev();
extern void _ZN7S1344C42v5Ev();
extern void _ZN7S1344C42v6Ev();
extern void _ZN7S1344C42v7Ev();
extern void _ZN7S1344C42v8Ev();
extern void _ZN7S1344C42v9Ev();
extern void _ZN7S1344C43v10Ev();
extern void _ZN7S1344C43v11Ev();
extern void _ZN7S1344C33v12Ev();
extern void _ZN7S1344C33v13Ev();
extern void _ZN7S1344C33v14Ev();
extern void _ZN7S1344C33v15Ev();
extern void _ZN7S1344C33v16Ev();
extern void _ZN7S1344C23v17Ev();
extern void _ZN7S1344C23v18Ev();
extern void _ZN7S1344C23v19Ev();
extern void _ZN7S1344C23v20Ev();
static  VTBL_ENTRY vtc_S1344C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1344C2[0]),
  (VTBL_ENTRY)&_ZN7S1344C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1344C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v17Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v18Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v20Ev,
};
extern VTBL_ENTRY _ZTI7S1344C2[];
extern  VTBL_ENTRY _ZTV7S1344C2[];
Class_Descriptor cd_S1344C2 = {  "S1344C2", // class name
  bases_S1344C2, 2,
  &(vtc_S1344C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,172), // object size
  NSPAIRA(_ZTI7S1344C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1344C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1344C1  : S1344C2 {
  virtual void  v1(); // _ZN7S1344C12v1Ev
  ~S1344C1(); // tgen
  S1344C1(); // tgen
};
//SIG(1 S1344C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v17 v18 v19 v20 Fi[2] Fc Fi[2] FC5 FC5} v1}


void  S1344C1 ::v1(){vfunc_called(this, "_ZN7S1344C12v1Ev");}
S1344C1 ::~S1344C1(){ note_dtor("S1344C1", this);} // tgen
S1344C1 ::S1344C1(){ note_ctor("S1344C1", this);} // tgen

static void Test_S1344C1()
{
  extern Class_Descriptor cd_S1344C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(33,44)];
    init_test(&cd_S1344C1, buf);
    S1344C1 *dp, &lv = *(dp=new (buf) S1344C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(256,172), "sizeof(S1344C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1344C1)");
    check_base_class_offset(lv, (S1344C4*)(S1344C3*)(S1344C2*), 0, "S1344C1");
    check_base_class_offset(lv, (S1344C3*)(S1344C2*), 0, "S1344C1");
    check_base_class_offset(lv, (S1344C2*), 0, "S1344C1");
    test_class_info(&lv, &cd_S1344C1);
    dp->~S1344C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1344C1(Test_S1344C1, "S1344C1", ABISELECT(256,172));

#else // __cplusplus

extern void _ZN7S1344C1C1Ev();
extern void _ZN7S1344C1D1Ev();
Name_Map name_map_S1344C1[] = {
  NSPAIR(_ZN7S1344C1C1Ev),
  NSPAIR(_ZN7S1344C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1344C4;
extern VTBL_ENTRY _ZTI7S1344C4[];
extern  VTBL_ENTRY _ZTV7S1344C4[];
extern Class_Descriptor cd_S1344C3;
extern VTBL_ENTRY _ZTI7S1344C3[];
extern  VTBL_ENTRY _ZTV7S1344C3[];
extern Class_Descriptor cd_S1344C2;
extern VTBL_ENTRY _ZTI7S1344C2[];
extern  VTBL_ENTRY _ZTV7S1344C2[];
static Base_Class bases_S1344C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1344C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1344C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1344C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1344C1[];
extern void _ZN7S1344C1D1Ev();
extern void _ZN7S1344C1D0Ev();
extern void _ZN7S1344C42v2Ev();
extern void _ZN7S1344C42v3Ev();
extern void _ZN7S1344C42v4Ev();
extern void _ZN7S1344C42v5Ev();
extern void _ZN7S1344C42v6Ev();
extern void _ZN7S1344C42v7Ev();
extern void _ZN7S1344C42v8Ev();
extern void _ZN7S1344C42v9Ev();
extern void _ZN7S1344C43v10Ev();
extern void _ZN7S1344C43v11Ev();
extern void _ZN7S1344C33v12Ev();
extern void _ZN7S1344C33v13Ev();
extern void _ZN7S1344C33v14Ev();
extern void _ZN7S1344C33v15Ev();
extern void _ZN7S1344C33v16Ev();
extern void _ZN7S1344C23v17Ev();
extern void _ZN7S1344C23v18Ev();
extern void _ZN7S1344C23v19Ev();
extern void _ZN7S1344C23v20Ev();
extern void _ZN7S1344C12v1Ev();
static  VTBL_ENTRY vtc_S1344C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1344C1[0]),
  (VTBL_ENTRY)&_ZN7S1344C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1344C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1344C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1344C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1344C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v17Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v18Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1344C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1344C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S1344C1[];
extern  VTBL_ENTRY _ZTV7S1344C1[];
Class_Descriptor cd_S1344C1 = {  "S1344C1", // class name
  bases_S1344C1, 3,
  &(vtc_S1344C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(256,172), // object size
  NSPAIRA(_ZTI7S1344C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1344C1),24, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1481C4  {
  void *s1481c4f0[2];
  ::S10103C13_nt s1481c4f1;
  void *s1481c4f2;
  virtual  ~S1481C4(); // _ZN7S1481C4D1Ev
  virtual void  v5(); // _ZN7S1481C42v5Ev
  virtual void  v6(); // _ZN7S1481C42v6Ev
  virtual void  v7(); // _ZN7S1481C42v7Ev
  virtual void  v8(); // _ZN7S1481C42v8Ev
  virtual void  v9(); // _ZN7S1481C42v9Ev
  virtual void  v10(); // _ZN7S1481C43v10Ev
  virtual void  v11(); // _ZN7S1481C43v11Ev
  virtual void  v12(); // _ZN7S1481C43v12Ev
  virtual void  v13(); // _ZN7S1481C43v13Ev
  virtual void  v14(); // _ZN7S1481C43v14Ev
  S1481C4(); // tgen
};
//SIG(-1 S1481C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1481C4 ::~S1481C4(){ note_dtor("S1481C4", this);}
void  S1481C4 ::v5(){vfunc_called(this, "_ZN7S1481C42v5Ev");}
void  S1481C4 ::v6(){vfunc_called(this, "_ZN7S1481C42v6Ev");}
void  S1481C4 ::v7(){vfunc_called(this, "_ZN7S1481C42v7Ev");}
void  S1481C4 ::v8(){vfunc_called(this, "_ZN7S1481C42v8Ev");}
void  S1481C4 ::v9(){vfunc_called(this, "_ZN7S1481C42v9Ev");}
void  S1481C4 ::v10(){vfunc_called(this, "_ZN7S1481C43v10Ev");}
void  S1481C4 ::v11(){vfunc_called(this, "_ZN7S1481C43v11Ev");}
void  S1481C4 ::v12(){vfunc_called(this, "_ZN7S1481C43v12Ev");}
void  S1481C4 ::v13(){vfunc_called(this, "_ZN7S1481C43v13Ev");}
void  S1481C4 ::v14(){vfunc_called(this, "_ZN7S1481C43v14Ev");}
S1481C4 ::S1481C4(){ note_ctor("S1481C4", this);} // tgen

static void Test_S1481C4()
{
  extern Class_Descriptor cd_S1481C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1481C4, buf);
    S1481C4 *dp, &lv = *(dp=new (buf) S1481C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1481C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1481C4)");
    check_field_offset(lv, s1481c4f0, ABISELECT(8,4), "S1481C4.s1481c4f0");
    check_field_offset(lv, s1481c4f1, ABISELECT(24,12), "S1481C4.s1481c4f1");
    check_field_offset(lv, s1481c4f2, ABISELECT(48,28), "S1481C4.s1481c4f2");
    test_class_info(&lv, &cd_S1481C4);
    dp->~S1481C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1481C4(Test_S1481C4, "S1481C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1481C4C1Ev();
extern void _ZN7S1481C4D1Ev();
Name_Map name_map_S1481C4[] = {
  NSPAIR(_ZN7S1481C4C1Ev),
  NSPAIR(_ZN7S1481C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1481C4[];
extern void _ZN7S1481C4D1Ev();
extern void _ZN7S1481C4D0Ev();
extern void _ZN7S1481C42v5Ev();
extern void _ZN7S1481C42v6Ev();
extern void _ZN7S1481C42v7Ev();
extern void _ZN7S1481C42v8Ev();
extern void _ZN7S1481C42v9Ev();
extern void _ZN7S1481C43v10Ev();
extern void _ZN7S1481C43v11Ev();
extern void _ZN7S1481C43v12Ev();
extern void _ZN7S1481C43v13Ev();
extern void _ZN7S1481C43v14Ev();
static  VTBL_ENTRY vtc_S1481C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1481C4[0]),
  (VTBL_ENTRY)&_ZN7S1481C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1481C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1481C4[];
extern  VTBL_ENTRY _ZTV7S1481C4[];
Class_Descriptor cd_S1481C4 = {  "S1481C4", // class name
  0,0,//no base classes
  &(vtc_S1481C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1481C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1481C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1481C3  : S1481C4 {
  void *s1481c3f0;
  ::S10103C13_nt s1481c3f1;
  ::S10103C13_nt s1481c3f2;
  ::S10103C13_nt s1481c3f3;
  ::S10103C86 s1481c3f4;
  ::S10103C86 s1481c3f5;
  ::S10103C86 s1481c3f6;
  virtual  ~S1481C3(); // _ZN7S1481C3D1Ev
  virtual void  v15(); // _ZN7S1481C33v15Ev
  virtual void  v16(); // _ZN7S1481C33v16Ev
  virtual void  v17(); // _ZN7S1481C33v17Ev
  virtual void  v18(); // _ZN7S1481C33v18Ev
  virtual void  v19(); // _ZN7S1481C33v19Ev
  S1481C3(); // tgen
};
//SIG(-1 S1481C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1481C3 ::~S1481C3(){ note_dtor("S1481C3", this);}
void  S1481C3 ::v15(){vfunc_called(this, "_ZN7S1481C33v15Ev");}
void  S1481C3 ::v16(){vfunc_called(this, "_ZN7S1481C33v16Ev");}
void  S1481C3 ::v17(){vfunc_called(this, "_ZN7S1481C33v17Ev");}
void  S1481C3 ::v18(){vfunc_called(this, "_ZN7S1481C33v18Ev");}
void  S1481C3 ::v19(){vfunc_called(this, "_ZN7S1481C33v19Ev");}
S1481C3 ::S1481C3(){ note_ctor("S1481C3", this);} // tgen

static void Test_S1481C3()
{
  extern Class_Descriptor cd_S1481C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1481C3, buf);
    S1481C3 *dp, &lv = *(dp=new (buf) S1481C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1481C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1481C3)");
    check_base_class_offset(lv, (S1481C4*), 0, "S1481C3");
    check_field_offset(lv, s1481c3f0, ABISELECT(56,32), "S1481C3.s1481c3f0");
    check_field_offset(lv, s1481c3f1, ABISELECT(64,36), "S1481C3.s1481c3f1");
    check_field_offset(lv, s1481c3f2, ABISELECT(88,52), "S1481C3.s1481c3f2");
    check_field_offset(lv, s1481c3f3, ABISELECT(112,68), "S1481C3.s1481c3f3");
    check_field_offset(lv, s1481c3f4, ABISELECT(136,84), "S1481C3.s1481c3f4");
    check_field_offset(lv, s1481c3f5, ABISELECT(152,96), "S1481C3.s1481c3f5");
    check_field_offset(lv, s1481c3f6, ABISELECT(168,108), "S1481C3.s1481c3f6");
    test_class_info(&lv, &cd_S1481C3);
    dp->~S1481C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1481C3(Test_S1481C3, "S1481C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1481C3C1Ev();
extern void _ZN7S1481C3D1Ev();
Name_Map name_map_S1481C3[] = {
  NSPAIR(_ZN7S1481C3C1Ev),
  NSPAIR(_ZN7S1481C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1481C4;
extern VTBL_ENTRY _ZTI7S1481C4[];
extern  VTBL_ENTRY _ZTV7S1481C4[];
static Base_Class bases_S1481C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1481C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1481C3[];
extern void _ZN7S1481C3D1Ev();
extern void _ZN7S1481C3D0Ev();
extern void _ZN7S1481C42v5Ev();
extern void _ZN7S1481C42v6Ev();
extern void _ZN7S1481C42v7Ev();
extern void _ZN7S1481C42v8Ev();
extern void _ZN7S1481C42v9Ev();
extern void _ZN7S1481C43v10Ev();
extern void _ZN7S1481C43v11Ev();
extern void _ZN7S1481C43v12Ev();
extern void _ZN7S1481C43v13Ev();
extern void _ZN7S1481C43v14Ev();
extern void _ZN7S1481C33v15Ev();
extern void _ZN7S1481C33v16Ev();
extern void _ZN7S1481C33v17Ev();
extern void _ZN7S1481C33v18Ev();
extern void _ZN7S1481C33v19Ev();
static  VTBL_ENTRY vtc_S1481C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1481C3[0]),
  (VTBL_ENTRY)&_ZN7S1481C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1481C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1481C3[];
extern  VTBL_ENTRY _ZTV7S1481C3[];
Class_Descriptor cd_S1481C3 = {  "S1481C3", // class name
  bases_S1481C3, 1,
  &(vtc_S1481C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1481C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1481C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1481C2  : S1481C3 {
  int s1481c2f0;
  virtual void  v20(); // _ZN7S1481C23v20Ev
  virtual void  v21(); // _ZN7S1481C23v21Ev
  virtual void  v22(); // _ZN7S1481C23v22Ev
  virtual void  v23(); // _ZN7S1481C23v23Ev
  ~S1481C2(); // tgen
  S1481C2(); // tgen
};
//SIG(-1 S1481C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fi}


void  S1481C2 ::v20(){vfunc_called(this, "_ZN7S1481C23v20Ev");}
void  S1481C2 ::v21(){vfunc_called(this, "_ZN7S1481C23v21Ev");}
void  S1481C2 ::v22(){vfunc_called(this, "_ZN7S1481C23v22Ev");}
void  S1481C2 ::v23(){vfunc_called(this, "_ZN7S1481C23v23Ev");}
S1481C2 ::~S1481C2(){ note_dtor("S1481C2", this);} // tgen
S1481C2 ::S1481C2(){ note_ctor("S1481C2", this);} // tgen

static void Test_S1481C2()
{
  extern Class_Descriptor cd_S1481C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1481C2, buf);
    S1481C2 *dp, &lv = *(dp=new (buf) S1481C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1481C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1481C2)");
    check_base_class_offset(lv, (S1481C4*)(S1481C3*), 0, "S1481C2");
    check_base_class_offset(lv, (S1481C3*), 0, "S1481C2");
    check_field_offset(lv, s1481c2f0, ABISELECT(184,120), "S1481C2.s1481c2f0");
    test_class_info(&lv, &cd_S1481C2);
    dp->~S1481C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1481C2(Test_S1481C2, "S1481C2", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1481C2C1Ev();
extern void _ZN7S1481C2D1Ev();
Name_Map name_map_S1481C2[] = {
  NSPAIR(_ZN7S1481C2C1Ev),
  NSPAIR(_ZN7S1481C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1481C4;
extern VTBL_ENTRY _ZTI7S1481C4[];
extern  VTBL_ENTRY _ZTV7S1481C4[];
extern Class_Descriptor cd_S1481C3;
extern VTBL_ENTRY _ZTI7S1481C3[];
extern  VTBL_ENTRY _ZTV7S1481C3[];
static Base_Class bases_S1481C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1481C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1481C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1481C2[];
extern void _ZN7S1481C2D1Ev();
extern void _ZN7S1481C2D0Ev();
extern void _ZN7S1481C42v5Ev();
extern void _ZN7S1481C42v6Ev();
extern void _ZN7S1481C42v7Ev();
extern void _ZN7S1481C42v8Ev();
extern void _ZN7S1481C42v9Ev();
extern void _ZN7S1481C43v10Ev();
extern void _ZN7S1481C43v11Ev();
extern void _ZN7S1481C43v12Ev();
extern void _ZN7S1481C43v13Ev();
extern void _ZN7S1481C43v14Ev();
extern void _ZN7S1481C33v15Ev();
extern void _ZN7S1481C33v16Ev();
extern void _ZN7S1481C33v17Ev();
extern void _ZN7S1481C33v18Ev();
extern void _ZN7S1481C33v19Ev();
extern void _ZN7S1481C23v20Ev();
extern void _ZN7S1481C23v21Ev();
extern void _ZN7S1481C23v22Ev();
extern void _ZN7S1481C23v23Ev();
static  VTBL_ENTRY vtc_S1481C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1481C2[0]),
  (VTBL_ENTRY)&_ZN7S1481C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1481C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1481C2[];
extern  VTBL_ENTRY _ZTV7S1481C2[];
Class_Descriptor cd_S1481C2 = {  "S1481C2", // class name
  bases_S1481C2, 2,
  &(vtc_S1481C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1481C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1481C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1481C1  : S1481C2 {
  ::S10103C13_nt s1481c1f0;
  ::S10103C13_nt s1481c1f1;
  virtual void  v1(); // _ZN7S1481C12v1Ev
  virtual void  v2(); // _ZN7S1481C12v2Ev
  virtual void  v3(); // _ZN7S1481C12v3Ev
  virtual void  v4(); // _ZN7S1481C12v4Ev
  ~S1481C1(); // tgen
  S1481C1(); // tgen
};
//SIG(1 S1481C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fi} v1 v2 v3 v4 FC5 FC5}


void  S1481C1 ::v1(){vfunc_called(this, "_ZN7S1481C12v1Ev");}
void  S1481C1 ::v2(){vfunc_called(this, "_ZN7S1481C12v2Ev");}
void  S1481C1 ::v3(){vfunc_called(this, "_ZN7S1481C12v3Ev");}
void  S1481C1 ::v4(){vfunc_called(this, "_ZN7S1481C12v4Ev");}
S1481C1 ::~S1481C1(){ note_dtor("S1481C1", this);} // tgen
S1481C1 ::S1481C1(){ note_ctor("S1481C1", this);} // tgen

static void Test_S1481C1()
{
  extern Class_Descriptor cd_S1481C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(31,40)];
    init_test(&cd_S1481C1, buf);
    S1481C1 *dp, &lv = *(dp=new (buf) S1481C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(240,156), "sizeof(S1481C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1481C1)");
    check_base_class_offset(lv, (S1481C4*)(S1481C3*)(S1481C2*), 0, "S1481C1");
    check_base_class_offset(lv, (S1481C3*)(S1481C2*), 0, "S1481C1");
    check_base_class_offset(lv, (S1481C2*), 0, "S1481C1");
    check_field_offset(lv, s1481c1f0, ABISELECT(192,124), "S1481C1.s1481c1f0");
    check_field_offset(lv, s1481c1f1, ABISELECT(216,140), "S1481C1.s1481c1f1");
    test_class_info(&lv, &cd_S1481C1);
    dp->~S1481C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1481C1(Test_S1481C1, "S1481C1", ABISELECT(240,156));

#else // __cplusplus

extern void _ZN7S1481C1C1Ev();
extern void _ZN7S1481C1D1Ev();
Name_Map name_map_S1481C1[] = {
  NSPAIR(_ZN7S1481C1C1Ev),
  NSPAIR(_ZN7S1481C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1481C4;
extern VTBL_ENTRY _ZTI7S1481C4[];
extern  VTBL_ENTRY _ZTV7S1481C4[];
extern Class_Descriptor cd_S1481C3;
extern VTBL_ENTRY _ZTI7S1481C3[];
extern  VTBL_ENTRY _ZTV7S1481C3[];
extern Class_Descriptor cd_S1481C2;
extern VTBL_ENTRY _ZTI7S1481C2[];
extern  VTBL_ENTRY _ZTV7S1481C2[];
static Base_Class bases_S1481C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1481C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1481C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1481C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1481C1[];
extern void _ZN7S1481C1D1Ev();
extern void _ZN7S1481C1D0Ev();
extern void _ZN7S1481C42v5Ev();
extern void _ZN7S1481C42v6Ev();
extern void _ZN7S1481C42v7Ev();
extern void _ZN7S1481C42v8Ev();
extern void _ZN7S1481C42v9Ev();
extern void _ZN7S1481C43v10Ev();
extern void _ZN7S1481C43v11Ev();
extern void _ZN7S1481C43v12Ev();
extern void _ZN7S1481C43v13Ev();
extern void _ZN7S1481C43v14Ev();
extern void _ZN7S1481C33v15Ev();
extern void _ZN7S1481C33v16Ev();
extern void _ZN7S1481C33v17Ev();
extern void _ZN7S1481C33v18Ev();
extern void _ZN7S1481C33v19Ev();
extern void _ZN7S1481C23v20Ev();
extern void _ZN7S1481C23v21Ev();
extern void _ZN7S1481C23v22Ev();
extern void _ZN7S1481C23v23Ev();
extern void _ZN7S1481C12v1Ev();
extern void _ZN7S1481C12v2Ev();
extern void _ZN7S1481C12v3Ev();
extern void _ZN7S1481C12v4Ev();
static  VTBL_ENTRY vtc_S1481C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1481C1[0]),
  (VTBL_ENTRY)&_ZN7S1481C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1481C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1481C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1481C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1481C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1481C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1481C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1481C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1481C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1481C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1481C1[];
extern  VTBL_ENTRY _ZTV7S1481C1[];
Class_Descriptor cd_S1481C1 = {  "S1481C1", // class name
  bases_S1481C1, 3,
  &(vtc_S1481C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(240,156), // object size
  NSPAIRA(_ZTI7S1481C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1481C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3260C3  {
  void *s3260c3f0[2];
  ::S10103C13_nt s3260c3f1;
  void *s3260c3f2;
  virtual  ~S3260C3(); // _ZN7S3260C3D1Ev
  virtual void  v4(); // _ZN7S3260C32v4Ev
  virtual void  v5(); // _ZN7S3260C32v5Ev
  virtual void  v6(); // _ZN7S3260C32v6Ev
  virtual void  v7(); // _ZN7S3260C32v7Ev
  virtual void  v8(); // _ZN7S3260C32v8Ev
  virtual void  v9(); // _ZN7S3260C32v9Ev
  virtual void  v10(); // _ZN7S3260C33v10Ev
  virtual void  v11(); // _ZN7S3260C33v11Ev
  virtual void  v12(); // _ZN7S3260C33v12Ev
  virtual void  v13(); // _ZN7S3260C33v13Ev
  S3260C3(); // tgen
};
//SIG(-1 S3260C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3260C3 ::~S3260C3(){ note_dtor("S3260C3", this);}
void  S3260C3 ::v4(){vfunc_called(this, "_ZN7S3260C32v4Ev");}
void  S3260C3 ::v5(){vfunc_called(this, "_ZN7S3260C32v5Ev");}
void  S3260C3 ::v6(){vfunc_called(this, "_ZN7S3260C32v6Ev");}
void  S3260C3 ::v7(){vfunc_called(this, "_ZN7S3260C32v7Ev");}
void  S3260C3 ::v8(){vfunc_called(this, "_ZN7S3260C32v8Ev");}
void  S3260C3 ::v9(){vfunc_called(this, "_ZN7S3260C32v9Ev");}
void  S3260C3 ::v10(){vfunc_called(this, "_ZN7S3260C33v10Ev");}
void  S3260C3 ::v11(){vfunc_called(this, "_ZN7S3260C33v11Ev");}
void  S3260C3 ::v12(){vfunc_called(this, "_ZN7S3260C33v12Ev");}
void  S3260C3 ::v13(){vfunc_called(this, "_ZN7S3260C33v13Ev");}
S3260C3 ::S3260C3(){ note_ctor("S3260C3", this);} // tgen

static void Test_S3260C3()
{
  extern Class_Descriptor cd_S3260C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3260C3, buf);
    S3260C3 *dp, &lv = *(dp=new (buf) S3260C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3260C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3260C3)");
    check_field_offset(lv, s3260c3f0, ABISELECT(8,4), "S3260C3.s3260c3f0");
    check_field_offset(lv, s3260c3f1, ABISELECT(24,12), "S3260C3.s3260c3f1");
    check_field_offset(lv, s3260c3f2, ABISELECT(48,28), "S3260C3.s3260c3f2");
    test_class_info(&lv, &cd_S3260C3);
    dp->~S3260C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3260C3(Test_S3260C3, "S3260C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3260C3C1Ev();
extern void _ZN7S3260C3D1Ev();
Name_Map name_map_S3260C3[] = {
  NSPAIR(_ZN7S3260C3C1Ev),
  NSPAIR(_ZN7S3260C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3260C3[];
extern void _ZN7S3260C3D1Ev();
extern void _ZN7S3260C3D0Ev();
extern void _ZN7S3260C32v4Ev();
extern void _ZN7S3260C32v5Ev();
extern void _ZN7S3260C32v6Ev();
extern void _ZN7S3260C32v7Ev();
extern void _ZN7S3260C32v8Ev();
extern void _ZN7S3260C32v9Ev();
extern void _ZN7S3260C33v10Ev();
extern void _ZN7S3260C33v11Ev();
extern void _ZN7S3260C33v12Ev();
extern void _ZN7S3260C33v13Ev();
static  VTBL_ENTRY vtc_S3260C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3260C3[0]),
  (VTBL_ENTRY)&_ZN7S3260C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3260C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v13Ev,
};
extern VTBL_ENTRY _ZTI7S3260C3[];
extern  VTBL_ENTRY _ZTV7S3260C3[];
Class_Descriptor cd_S3260C3 = {  "S3260C3", // class name
  0,0,//no base classes
  &(vtc_S3260C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3260C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3260C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3260C2  : S3260C3 {
  void *s3260c2f0;
  ::S10103C13_nt s3260c2f1;
  ::S10103C13_nt s3260c2f2;
  ::S10103C13_nt s3260c2f3;
  ::S10103C86 s3260c2f4;
  ::S10103C86 s3260c2f5;
  ::S10103C86 s3260c2f6;
  virtual  ~S3260C2(); // _ZN7S3260C2D1Ev
  virtual void  v14(); // _ZN7S3260C23v14Ev
  virtual void  v15(); // _ZN7S3260C23v15Ev
  virtual void  v16(); // _ZN7S3260C23v16Ev
  virtual void  v17(); // _ZN7S3260C23v17Ev
  virtual void  v18(); // _ZN7S3260C23v18Ev
  S3260C2(); // tgen
};
//SIG(-1 S3260C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3260C2 ::~S3260C2(){ note_dtor("S3260C2", this);}
void  S3260C2 ::v14(){vfunc_called(this, "_ZN7S3260C23v14Ev");}
void  S3260C2 ::v15(){vfunc_called(this, "_ZN7S3260C23v15Ev");}
void  S3260C2 ::v16(){vfunc_called(this, "_ZN7S3260C23v16Ev");}
void  S3260C2 ::v17(){vfunc_called(this, "_ZN7S3260C23v17Ev");}
void  S3260C2 ::v18(){vfunc_called(this, "_ZN7S3260C23v18Ev");}
S3260C2 ::S3260C2(){ note_ctor("S3260C2", this);} // tgen

static void Test_S3260C2()
{
  extern Class_Descriptor cd_S3260C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3260C2, buf);
    S3260C2 *dp, &lv = *(dp=new (buf) S3260C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3260C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3260C2)");
    check_base_class_offset(lv, (S3260C3*), 0, "S3260C2");
    check_field_offset(lv, s3260c2f0, ABISELECT(56,32), "S3260C2.s3260c2f0");
    check_field_offset(lv, s3260c2f1, ABISELECT(64,36), "S3260C2.s3260c2f1");
    check_field_offset(lv, s3260c2f2, ABISELECT(88,52), "S3260C2.s3260c2f2");
    check_field_offset(lv, s3260c2f3, ABISELECT(112,68), "S3260C2.s3260c2f3");
    check_field_offset(lv, s3260c2f4, ABISELECT(136,84), "S3260C2.s3260c2f4");
    check_field_offset(lv, s3260c2f5, ABISELECT(152,96), "S3260C2.s3260c2f5");
    check_field_offset(lv, s3260c2f6, ABISELECT(168,108), "S3260C2.s3260c2f6");
    test_class_info(&lv, &cd_S3260C2);
    dp->~S3260C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3260C2(Test_S3260C2, "S3260C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3260C2C1Ev();
extern void _ZN7S3260C2D1Ev();
Name_Map name_map_S3260C2[] = {
  NSPAIR(_ZN7S3260C2C1Ev),
  NSPAIR(_ZN7S3260C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3260C3;
extern VTBL_ENTRY _ZTI7S3260C3[];
extern  VTBL_ENTRY _ZTV7S3260C3[];
static Base_Class bases_S3260C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3260C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3260C2[];
extern void _ZN7S3260C2D1Ev();
extern void _ZN7S3260C2D0Ev();
extern void _ZN7S3260C32v4Ev();
extern void _ZN7S3260C32v5Ev();
extern void _ZN7S3260C32v6Ev();
extern void _ZN7S3260C32v7Ev();
extern void _ZN7S3260C32v8Ev();
extern void _ZN7S3260C32v9Ev();
extern void _ZN7S3260C33v10Ev();
extern void _ZN7S3260C33v11Ev();
extern void _ZN7S3260C33v12Ev();
extern void _ZN7S3260C33v13Ev();
extern void _ZN7S3260C23v14Ev();
extern void _ZN7S3260C23v15Ev();
extern void _ZN7S3260C23v16Ev();
extern void _ZN7S3260C23v17Ev();
extern void _ZN7S3260C23v18Ev();
static  VTBL_ENTRY vtc_S3260C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3260C2[0]),
  (VTBL_ENTRY)&_ZN7S3260C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3260C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v18Ev,
};
extern VTBL_ENTRY _ZTI7S3260C2[];
extern  VTBL_ENTRY _ZTV7S3260C2[];
Class_Descriptor cd_S3260C2 = {  "S3260C2", // class name
  bases_S3260C2, 1,
  &(vtc_S3260C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3260C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3260C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3260C1  : S3260C2 {
  void *s3260c1f0;
  int s3260c1f1;
  ::S10103C13_nt s3260c1f2;
  ::S10103C13_nt s3260c1f3;
  ::S10103C13_nt s3260c1f4;
  ::S10103C13_nt s3260c1f5;
  ::S10103C13_nt s3260c1f6;
  ::S10103C13_nt s3260c1f7;
  virtual  ~S3260C1(); // _ZN7S3260C1D1Ev
  virtual void  v1(); // _ZN7S3260C12v1Ev
  virtual void  v2(); // _ZN7S3260C12v2Ev
  virtual void  v3(); // _ZN7S3260C12v3Ev
  S3260C1(); // tgen
};
//SIG(1 S3260C1) C1{ BC2{ BC3{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 Fp Fi FC4 FC4 FC4 FC4 FC4 FC4}


 S3260C1 ::~S3260C1(){ note_dtor("S3260C1", this);}
void  S3260C1 ::v1(){vfunc_called(this, "_ZN7S3260C12v1Ev");}
void  S3260C1 ::v2(){vfunc_called(this, "_ZN7S3260C12v2Ev");}
void  S3260C1 ::v3(){vfunc_called(this, "_ZN7S3260C12v3Ev");}
S3260C1 ::S3260C1(){ note_ctor("S3260C1", this);} // tgen

static void Test_S3260C1()
{
  extern Class_Descriptor cd_S3260C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(44,57)];
    init_test(&cd_S3260C1, buf);
    S3260C1 *dp, &lv = *(dp=new (buf) S3260C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(344,224), "sizeof(S3260C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3260C1)");
    check_base_class_offset(lv, (S3260C3*)(S3260C2*), 0, "S3260C1");
    check_base_class_offset(lv, (S3260C2*), 0, "S3260C1");
    check_field_offset(lv, s3260c1f0, ABISELECT(184,120), "S3260C1.s3260c1f0");
    check_field_offset(lv, s3260c1f1, ABISELECT(192,124), "S3260C1.s3260c1f1");
    check_field_offset(lv, s3260c1f2, ABISELECT(200,128), "S3260C1.s3260c1f2");
    check_field_offset(lv, s3260c1f3, ABISELECT(224,144), "S3260C1.s3260c1f3");
    check_field_offset(lv, s3260c1f4, ABISELECT(248,160), "S3260C1.s3260c1f4");
    check_field_offset(lv, s3260c1f5, ABISELECT(272,176), "S3260C1.s3260c1f5");
    check_field_offset(lv, s3260c1f6, ABISELECT(296,192), "S3260C1.s3260c1f6");
    check_field_offset(lv, s3260c1f7, ABISELECT(320,208), "S3260C1.s3260c1f7");
    test_class_info(&lv, &cd_S3260C1);
    dp->~S3260C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3260C1(Test_S3260C1, "S3260C1", ABISELECT(344,224));

#else // __cplusplus

extern void _ZN7S3260C1C1Ev();
extern void _ZN7S3260C1D1Ev();
Name_Map name_map_S3260C1[] = {
  NSPAIR(_ZN7S3260C1C1Ev),
  NSPAIR(_ZN7S3260C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3260C3;
extern VTBL_ENTRY _ZTI7S3260C3[];
extern  VTBL_ENTRY _ZTV7S3260C3[];
extern Class_Descriptor cd_S3260C2;
extern VTBL_ENTRY _ZTI7S3260C2[];
extern  VTBL_ENTRY _ZTV7S3260C2[];
static Base_Class bases_S3260C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3260C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3260C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3260C1[];
extern void _ZN7S3260C1D1Ev();
extern void _ZN7S3260C1D0Ev();
extern void _ZN7S3260C32v4Ev();
extern void _ZN7S3260C32v5Ev();
extern void _ZN7S3260C32v6Ev();
extern void _ZN7S3260C32v7Ev();
extern void _ZN7S3260C32v8Ev();
extern void _ZN7S3260C32v9Ev();
extern void _ZN7S3260C33v10Ev();
extern void _ZN7S3260C33v11Ev();
extern void _ZN7S3260C33v12Ev();
extern void _ZN7S3260C33v13Ev();
extern void _ZN7S3260C23v14Ev();
extern void _ZN7S3260C23v15Ev();
extern void _ZN7S3260C23v16Ev();
extern void _ZN7S3260C23v17Ev();
extern void _ZN7S3260C23v18Ev();
extern void _ZN7S3260C12v1Ev();
extern void _ZN7S3260C12v2Ev();
extern void _ZN7S3260C12v3Ev();
static  VTBL_ENTRY vtc_S3260C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3260C1[0]),
  (VTBL_ENTRY)&_ZN7S3260C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3260C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3260C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3260C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3260C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3260C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3260C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3260C12v3Ev,
};
extern VTBL_ENTRY _ZTI7S3260C1[];
extern  VTBL_ENTRY _ZTV7S3260C1[];
Class_Descriptor cd_S3260C1 = {  "S3260C1", // class name
  bases_S3260C1, 2,
  &(vtc_S3260C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(344,224), // object size
  NSPAIRA(_ZTI7S3260C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3260C1),22, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1442C4  {
  void *s1442c4f0[2];
  ::S10103C13_nt s1442c4f1;
  void *s1442c4f2;
  virtual  ~S1442C4(); // _ZN7S1442C4D1Ev
  virtual void  v4(); // _ZN7S1442C42v4Ev
  virtual void  v5(); // _ZN7S1442C42v5Ev
  virtual void  v6(); // _ZN7S1442C42v6Ev
  virtual void  v7(); // _ZN7S1442C42v7Ev
  virtual void  v8(); // _ZN7S1442C42v8Ev
  virtual void  v9(); // _ZN7S1442C42v9Ev
  virtual void  v10(); // _ZN7S1442C43v10Ev
  virtual void  v11(); // _ZN7S1442C43v11Ev
  virtual void  v12(); // _ZN7S1442C43v12Ev
  virtual void  v13(); // _ZN7S1442C43v13Ev
  S1442C4(); // tgen
};
//SIG(-1 S1442C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1442C4 ::~S1442C4(){ note_dtor("S1442C4", this);}
void  S1442C4 ::v4(){vfunc_called(this, "_ZN7S1442C42v4Ev");}
void  S1442C4 ::v5(){vfunc_called(this, "_ZN7S1442C42v5Ev");}
void  S1442C4 ::v6(){vfunc_called(this, "_ZN7S1442C42v6Ev");}
void  S1442C4 ::v7(){vfunc_called(this, "_ZN7S1442C42v7Ev");}
void  S1442C4 ::v8(){vfunc_called(this, "_ZN7S1442C42v8Ev");}
void  S1442C4 ::v9(){vfunc_called(this, "_ZN7S1442C42v9Ev");}
void  S1442C4 ::v10(){vfunc_called(this, "_ZN7S1442C43v10Ev");}
void  S1442C4 ::v11(){vfunc_called(this, "_ZN7S1442C43v11Ev");}
void  S1442C4 ::v12(){vfunc_called(this, "_ZN7S1442C43v12Ev");}
void  S1442C4 ::v13(){vfunc_called(this, "_ZN7S1442C43v13Ev");}
S1442C4 ::S1442C4(){ note_ctor("S1442C4", this);} // tgen

static void Test_S1442C4()
{
  extern Class_Descriptor cd_S1442C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1442C4, buf);
    S1442C4 *dp, &lv = *(dp=new (buf) S1442C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1442C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1442C4)");
    check_field_offset(lv, s1442c4f0, ABISELECT(8,4), "S1442C4.s1442c4f0");
    check_field_offset(lv, s1442c4f1, ABISELECT(24,12), "S1442C4.s1442c4f1");
    check_field_offset(lv, s1442c4f2, ABISELECT(48,28), "S1442C4.s1442c4f2");
    test_class_info(&lv, &cd_S1442C4);
    dp->~S1442C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1442C4(Test_S1442C4, "S1442C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1442C4C1Ev();
extern void _ZN7S1442C4D1Ev();
Name_Map name_map_S1442C4[] = {
  NSPAIR(_ZN7S1442C4C1Ev),
  NSPAIR(_ZN7S1442C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1442C4[];
extern void _ZN7S1442C4D1Ev();
extern void _ZN7S1442C4D0Ev();
extern void _ZN7S1442C42v4Ev();
extern void _ZN7S1442C42v5Ev();
extern void _ZN7S1442C42v6Ev();
extern void _ZN7S1442C42v7Ev();
extern void _ZN7S1442C42v8Ev();
extern void _ZN7S1442C42v9Ev();
extern void _ZN7S1442C43v10Ev();
extern void _ZN7S1442C43v11Ev();
extern void _ZN7S1442C43v12Ev();
extern void _ZN7S1442C43v13Ev();
static  VTBL_ENTRY vtc_S1442C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1442C4[0]),
  (VTBL_ENTRY)&_ZN7S1442C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1442C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v13Ev,
};
extern VTBL_ENTRY _ZTI7S1442C4[];
extern  VTBL_ENTRY _ZTV7S1442C4[];
Class_Descriptor cd_S1442C4 = {  "S1442C4", // class name
  0,0,//no base classes
  &(vtc_S1442C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1442C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1442C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1442C3  : S1442C4 {
  void *s1442c3f0;
  ::S10103C13_nt s1442c3f1;
  ::S10103C13_nt s1442c3f2;
  ::S10103C13_nt s1442c3f3;
  ::S10103C86 s1442c3f4;
  ::S10103C86 s1442c3f5;
  ::S10103C86 s1442c3f6;
  virtual  ~S1442C3(); // _ZN7S1442C3D1Ev
  virtual void  v14(); // _ZN7S1442C33v14Ev
  virtual void  v15(); // _ZN7S1442C33v15Ev
  virtual void  v16(); // _ZN7S1442C33v16Ev
  virtual void  v17(); // _ZN7S1442C33v17Ev
  virtual void  v18(); // _ZN7S1442C33v18Ev
  S1442C3(); // tgen
};
//SIG(-1 S1442C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1442C3 ::~S1442C3(){ note_dtor("S1442C3", this);}
void  S1442C3 ::v14(){vfunc_called(this, "_ZN7S1442C33v14Ev");}
void  S1442C3 ::v15(){vfunc_called(this, "_ZN7S1442C33v15Ev");}
void  S1442C3 ::v16(){vfunc_called(this, "_ZN7S1442C33v16Ev");}
void  S1442C3 ::v17(){vfunc_called(this, "_ZN7S1442C33v17Ev");}
void  S1442C3 ::v18(){vfunc_called(this, "_ZN7S1442C33v18Ev");}
S1442C3 ::S1442C3(){ note_ctor("S1442C3", this);} // tgen

static void Test_S1442C3()
{
  extern Class_Descriptor cd_S1442C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1442C3, buf);
    S1442C3 *dp, &lv = *(dp=new (buf) S1442C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1442C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1442C3)");
    check_base_class_offset(lv, (S1442C4*), 0, "S1442C3");
    check_field_offset(lv, s1442c3f0, ABISELECT(56,32), "S1442C3.s1442c3f0");
    check_field_offset(lv, s1442c3f1, ABISELECT(64,36), "S1442C3.s1442c3f1");
    check_field_offset(lv, s1442c3f2, ABISELECT(88,52), "S1442C3.s1442c3f2");
    check_field_offset(lv, s1442c3f3, ABISELECT(112,68), "S1442C3.s1442c3f3");
    check_field_offset(lv, s1442c3f4, ABISELECT(136,84), "S1442C3.s1442c3f4");
    check_field_offset(lv, s1442c3f5, ABISELECT(152,96), "S1442C3.s1442c3f5");
    check_field_offset(lv, s1442c3f6, ABISELECT(168,108), "S1442C3.s1442c3f6");
    test_class_info(&lv, &cd_S1442C3);
    dp->~S1442C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1442C3(Test_S1442C3, "S1442C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1442C3C1Ev();
extern void _ZN7S1442C3D1Ev();
Name_Map name_map_S1442C3[] = {
  NSPAIR(_ZN7S1442C3C1Ev),
  NSPAIR(_ZN7S1442C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1442C4;
extern VTBL_ENTRY _ZTI7S1442C4[];
extern  VTBL_ENTRY _ZTV7S1442C4[];
static Base_Class bases_S1442C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1442C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1442C3[];
extern void _ZN7S1442C3D1Ev();
extern void _ZN7S1442C3D0Ev();
extern void _ZN7S1442C42v4Ev();
extern void _ZN7S1442C42v5Ev();
extern void _ZN7S1442C42v6Ev();
extern void _ZN7S1442C42v7Ev();
extern void _ZN7S1442C42v8Ev();
extern void _ZN7S1442C42v9Ev();
extern void _ZN7S1442C43v10Ev();
extern void _ZN7S1442C43v11Ev();
extern void _ZN7S1442C43v12Ev();
extern void _ZN7S1442C43v13Ev();
extern void _ZN7S1442C33v14Ev();
extern void _ZN7S1442C33v15Ev();
extern void _ZN7S1442C33v16Ev();
extern void _ZN7S1442C33v17Ev();
extern void _ZN7S1442C33v18Ev();
static  VTBL_ENTRY vtc_S1442C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1442C3[0]),
  (VTBL_ENTRY)&_ZN7S1442C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1442C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v18Ev,
};
extern VTBL_ENTRY _ZTI7S1442C3[];
extern  VTBL_ENTRY _ZTV7S1442C3[];
Class_Descriptor cd_S1442C3 = {  "S1442C3", // class name
  bases_S1442C3, 1,
  &(vtc_S1442C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1442C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1442C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1442C2  : S1442C3 {
  char s1442c2f0;
  virtual void  v19(); // _ZN7S1442C23v19Ev
  virtual void  v20(); // _ZN7S1442C23v20Ev
  virtual void  v21(); // _ZN7S1442C23v21Ev
  ~S1442C2(); // tgen
  S1442C2(); // tgen
};
//SIG(-1 S1442C2) C1{ BC2{ BC3{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 Fc}


void  S1442C2 ::v19(){vfunc_called(this, "_ZN7S1442C23v19Ev");}
void  S1442C2 ::v20(){vfunc_called(this, "_ZN7S1442C23v20Ev");}
void  S1442C2 ::v21(){vfunc_called(this, "_ZN7S1442C23v21Ev");}
S1442C2 ::~S1442C2(){ note_dtor("S1442C2", this);} // tgen
S1442C2 ::S1442C2(){ note_ctor("S1442C2", this);} // tgen

static void Test_S1442C2()
{
  extern Class_Descriptor cd_S1442C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1442C2, buf);
    S1442C2 *dp, &lv = *(dp=new (buf) S1442C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1442C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1442C2)");
    check_base_class_offset(lv, (S1442C4*)(S1442C3*), 0, "S1442C2");
    check_base_class_offset(lv, (S1442C3*), 0, "S1442C2");
    check_field_offset(lv, s1442c2f0, ABISELECT(184,120), "S1442C2.s1442c2f0");
    test_class_info(&lv, &cd_S1442C2);
    dp->~S1442C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1442C2(Test_S1442C2, "S1442C2", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1442C2C1Ev();
extern void _ZN7S1442C2D1Ev();
Name_Map name_map_S1442C2[] = {
  NSPAIR(_ZN7S1442C2C1Ev),
  NSPAIR(_ZN7S1442C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1442C4;
extern VTBL_ENTRY _ZTI7S1442C4[];
extern  VTBL_ENTRY _ZTV7S1442C4[];
extern Class_Descriptor cd_S1442C3;
extern VTBL_ENTRY _ZTI7S1442C3[];
extern  VTBL_ENTRY _ZTV7S1442C3[];
static Base_Class bases_S1442C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1442C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1442C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1442C2[];
extern void _ZN7S1442C2D1Ev();
extern void _ZN7S1442C2D0Ev();
extern void _ZN7S1442C42v4Ev();
extern void _ZN7S1442C42v5Ev();
extern void _ZN7S1442C42v6Ev();
extern void _ZN7S1442C42v7Ev();
extern void _ZN7S1442C42v8Ev();
extern void _ZN7S1442C42v9Ev();
extern void _ZN7S1442C43v10Ev();
extern void _ZN7S1442C43v11Ev();
extern void _ZN7S1442C43v12Ev();
extern void _ZN7S1442C43v13Ev();
extern void _ZN7S1442C33v14Ev();
extern void _ZN7S1442C33v15Ev();
extern void _ZN7S1442C33v16Ev();
extern void _ZN7S1442C33v17Ev();
extern void _ZN7S1442C33v18Ev();
extern void _ZN7S1442C23v19Ev();
extern void _ZN7S1442C23v20Ev();
extern void _ZN7S1442C23v21Ev();
static  VTBL_ENTRY vtc_S1442C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1442C2[0]),
  (VTBL_ENTRY)&_ZN7S1442C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1442C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1442C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1442C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1442C23v21Ev,
};
extern VTBL_ENTRY _ZTI7S1442C2[];
extern  VTBL_ENTRY _ZTV7S1442C2[];
Class_Descriptor cd_S1442C2 = {  "S1442C2", // class name
  bases_S1442C2, 2,
  &(vtc_S1442C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1442C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1442C2),22, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1442C1  : S1442C2 {
  int s1442c1f0[3];
  char s1442c1f1;
  int s1442c1f2;
  virtual void  v1(); // _ZN7S1442C12v1Ev
  virtual void  v2(); // _ZN7S1442C12v2Ev
  virtual void  v3(); // _ZN7S1442C12v3Ev
  ~S1442C1(); // tgen
  S1442C1(); // tgen
};
//SIG(1 S1442C1) C1{ BC2{ BC3{ BC4{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v19 v20 v21 Fc} v1 v2 v3 Fi[3] Fc Fi}


void  S1442C1 ::v1(){vfunc_called(this, "_ZN7S1442C12v1Ev");}
void  S1442C1 ::v2(){vfunc_called(this, "_ZN7S1442C12v2Ev");}
void  S1442C1 ::v3(){vfunc_called(this, "_ZN7S1442C12v3Ev");}
S1442C1 ::~S1442C1(){ note_dtor("S1442C1", this);} // tgen
S1442C1 ::S1442C1(){ note_ctor("S1442C1", this);} // tgen

static void Test_S1442C1()
{
  extern Class_Descriptor cd_S1442C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(27,37)];
    init_test(&cd_S1442C1, buf);
    S1442C1 *dp, &lv = *(dp=new (buf) S1442C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(208,144), "sizeof(S1442C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1442C1)");
    check_base_class_offset(lv, (S1442C4*)(S1442C3*)(S1442C2*), 0, "S1442C1");
    check_base_class_offset(lv, (S1442C3*)(S1442C2*), 0, "S1442C1");
    check_base_class_offset(lv, (S1442C2*), 0, "S1442C1");
    check_field_offset(lv, s1442c1f0, ABISELECT(188,124), "S1442C1.s1442c1f0");
    check_field_offset(lv, s1442c1f1, ABISELECT(200,136), "S1442C1.s1442c1f1");
    check_field_offset(lv, s1442c1f2, ABISELECT(204,140), "S1442C1.s1442c1f2");
    test_class_info(&lv, &cd_S1442C1);
    dp->~S1442C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1442C1(Test_S1442C1, "S1442C1", ABISELECT(208,144));

#else // __cplusplus

extern void _ZN7S1442C1C1Ev();
extern void _ZN7S1442C1D1Ev();
Name_Map name_map_S1442C1[] = {
  NSPAIR(_ZN7S1442C1C1Ev),
  NSPAIR(_ZN7S1442C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1442C4;
extern VTBL_ENTRY _ZTI7S1442C4[];
extern  VTBL_ENTRY _ZTV7S1442C4[];
extern Class_Descriptor cd_S1442C3;
extern VTBL_ENTRY _ZTI7S1442C3[];
extern  VTBL_ENTRY _ZTV7S1442C3[];
extern Class_Descriptor cd_S1442C2;
extern VTBL_ENTRY _ZTI7S1442C2[];
extern  VTBL_ENTRY _ZTV7S1442C2[];
static Base_Class bases_S1442C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1442C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1442C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1442C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1442C1[];
extern void _ZN7S1442C1D1Ev();
extern void _ZN7S1442C1D0Ev();
extern void _ZN7S1442C42v4Ev();
extern void _ZN7S1442C42v5Ev();
extern void _ZN7S1442C42v6Ev();
extern void _ZN7S1442C42v7Ev();
extern void _ZN7S1442C42v8Ev();
extern void _ZN7S1442C42v9Ev();
extern void _ZN7S1442C43v10Ev();
extern void _ZN7S1442C43v11Ev();
extern void _ZN7S1442C43v12Ev();
extern void _ZN7S1442C43v13Ev();
extern void _ZN7S1442C33v14Ev();
extern void _ZN7S1442C33v15Ev();
extern void _ZN7S1442C33v16Ev();
extern void _ZN7S1442C33v17Ev();
extern void _ZN7S1442C33v18Ev();
extern void _ZN7S1442C23v19Ev();
extern void _ZN7S1442C23v20Ev();
extern void _ZN7S1442C23v21Ev();
extern void _ZN7S1442C12v1Ev();
extern void _ZN7S1442C12v2Ev();
extern void _ZN7S1442C12v3Ev();
static  VTBL_ENTRY vtc_S1442C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1442C1[0]),
  (VTBL_ENTRY)&_ZN7S1442C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1442C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1442C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1442C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1442C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1442C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1442C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1442C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1442C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1442C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1442C12v3Ev,
};
extern VTBL_ENTRY _ZTI7S1442C1[];
extern  VTBL_ENTRY _ZTV7S1442C1[];
Class_Descriptor cd_S1442C1 = {  "S1442C1", // class name
  bases_S1442C1, 3,
  &(vtc_S1442C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(208,144), // object size
  NSPAIRA(_ZTI7S1442C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1442C1),25, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1478C4  {
  void *s1478c4f0[2];
  ::S10103C13_nt s1478c4f1;
  void *s1478c4f2;
  virtual  ~S1478C4(); // _ZN7S1478C4D1Ev
  virtual void  v5(); // _ZN7S1478C42v5Ev
  virtual void  v6(); // _ZN7S1478C42v6Ev
  virtual void  v7(); // _ZN7S1478C42v7Ev
  virtual void  v8(); // _ZN7S1478C42v8Ev
  virtual void  v9(); // _ZN7S1478C42v9Ev
  virtual void  v10(); // _ZN7S1478C43v10Ev
  virtual void  v11(); // _ZN7S1478C43v11Ev
  virtual void  v12(); // _ZN7S1478C43v12Ev
  virtual void  v13(); // _ZN7S1478C43v13Ev
  virtual void  v14(); // _ZN7S1478C43v14Ev
  S1478C4(); // tgen
};
//SIG(-1 S1478C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1478C4 ::~S1478C4(){ note_dtor("S1478C4", this);}
void  S1478C4 ::v5(){vfunc_called(this, "_ZN7S1478C42v5Ev");}
void  S1478C4 ::v6(){vfunc_called(this, "_ZN7S1478C42v6Ev");}
void  S1478C4 ::v7(){vfunc_called(this, "_ZN7S1478C42v7Ev");}
void  S1478C4 ::v8(){vfunc_called(this, "_ZN7S1478C42v8Ev");}
void  S1478C4 ::v9(){vfunc_called(this, "_ZN7S1478C42v9Ev");}
void  S1478C4 ::v10(){vfunc_called(this, "_ZN7S1478C43v10Ev");}
void  S1478C4 ::v11(){vfunc_called(this, "_ZN7S1478C43v11Ev");}
void  S1478C4 ::v12(){vfunc_called(this, "_ZN7S1478C43v12Ev");}
void  S1478C4 ::v13(){vfunc_called(this, "_ZN7S1478C43v13Ev");}
void  S1478C4 ::v14(){vfunc_called(this, "_ZN7S1478C43v14Ev");}
S1478C4 ::S1478C4(){ note_ctor("S1478C4", this);} // tgen

static void Test_S1478C4()
{
  extern Class_Descriptor cd_S1478C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1478C4, buf);
    S1478C4 *dp, &lv = *(dp=new (buf) S1478C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1478C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1478C4)");
    check_field_offset(lv, s1478c4f0, ABISELECT(8,4), "S1478C4.s1478c4f0");
    check_field_offset(lv, s1478c4f1, ABISELECT(24,12), "S1478C4.s1478c4f1");
    check_field_offset(lv, s1478c4f2, ABISELECT(48,28), "S1478C4.s1478c4f2");
    test_class_info(&lv, &cd_S1478C4);
    dp->~S1478C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1478C4(Test_S1478C4, "S1478C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1478C4C1Ev();
extern void _ZN7S1478C4D1Ev();
Name_Map name_map_S1478C4[] = {
  NSPAIR(_ZN7S1478C4C1Ev),
  NSPAIR(_ZN7S1478C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1478C4[];
extern void _ZN7S1478C4D1Ev();
extern void _ZN7S1478C4D0Ev();
extern void _ZN7S1478C42v5Ev();
extern void _ZN7S1478C42v6Ev();
extern void _ZN7S1478C42v7Ev();
extern void _ZN7S1478C42v8Ev();
extern void _ZN7S1478C42v9Ev();
extern void _ZN7S1478C43v10Ev();
extern void _ZN7S1478C43v11Ev();
extern void _ZN7S1478C43v12Ev();
extern void _ZN7S1478C43v13Ev();
extern void _ZN7S1478C43v14Ev();
static  VTBL_ENTRY vtc_S1478C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1478C4[0]),
  (VTBL_ENTRY)&_ZN7S1478C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1478C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v14Ev,
};
extern VTBL_ENTRY _ZTI7S1478C4[];
extern  VTBL_ENTRY _ZTV7S1478C4[];
Class_Descriptor cd_S1478C4 = {  "S1478C4", // class name
  0,0,//no base classes
  &(vtc_S1478C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1478C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1478C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1478C3  : S1478C4 {
  void *s1478c3f0;
  ::S10103C13_nt s1478c3f1;
  ::S10103C13_nt s1478c3f2;
  ::S10103C13_nt s1478c3f3;
  ::S10103C86 s1478c3f4;
  ::S10103C86 s1478c3f5;
  ::S10103C86 s1478c3f6;
  virtual  ~S1478C3(); // _ZN7S1478C3D1Ev
  virtual void  v15(); // _ZN7S1478C33v15Ev
  virtual void  v16(); // _ZN7S1478C33v16Ev
  virtual void  v17(); // _ZN7S1478C33v17Ev
  virtual void  v18(); // _ZN7S1478C33v18Ev
  virtual void  v19(); // _ZN7S1478C33v19Ev
  S1478C3(); // tgen
};
//SIG(-1 S1478C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1478C3 ::~S1478C3(){ note_dtor("S1478C3", this);}
void  S1478C3 ::v15(){vfunc_called(this, "_ZN7S1478C33v15Ev");}
void  S1478C3 ::v16(){vfunc_called(this, "_ZN7S1478C33v16Ev");}
void  S1478C3 ::v17(){vfunc_called(this, "_ZN7S1478C33v17Ev");}
void  S1478C3 ::v18(){vfunc_called(this, "_ZN7S1478C33v18Ev");}
void  S1478C3 ::v19(){vfunc_called(this, "_ZN7S1478C33v19Ev");}
S1478C3 ::S1478C3(){ note_ctor("S1478C3", this);} // tgen

static void Test_S1478C3()
{
  extern Class_Descriptor cd_S1478C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1478C3, buf);
    S1478C3 *dp, &lv = *(dp=new (buf) S1478C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1478C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1478C3)");
    check_base_class_offset(lv, (S1478C4*), 0, "S1478C3");
    check_field_offset(lv, s1478c3f0, ABISELECT(56,32), "S1478C3.s1478c3f0");
    check_field_offset(lv, s1478c3f1, ABISELECT(64,36), "S1478C3.s1478c3f1");
    check_field_offset(lv, s1478c3f2, ABISELECT(88,52), "S1478C3.s1478c3f2");
    check_field_offset(lv, s1478c3f3, ABISELECT(112,68), "S1478C3.s1478c3f3");
    check_field_offset(lv, s1478c3f4, ABISELECT(136,84), "S1478C3.s1478c3f4");
    check_field_offset(lv, s1478c3f5, ABISELECT(152,96), "S1478C3.s1478c3f5");
    check_field_offset(lv, s1478c3f6, ABISELECT(168,108), "S1478C3.s1478c3f6");
    test_class_info(&lv, &cd_S1478C3);
    dp->~S1478C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1478C3(Test_S1478C3, "S1478C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1478C3C1Ev();
extern void _ZN7S1478C3D1Ev();
Name_Map name_map_S1478C3[] = {
  NSPAIR(_ZN7S1478C3C1Ev),
  NSPAIR(_ZN7S1478C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1478C4;
extern VTBL_ENTRY _ZTI7S1478C4[];
extern  VTBL_ENTRY _ZTV7S1478C4[];
static Base_Class bases_S1478C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1478C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1478C3[];
extern void _ZN7S1478C3D1Ev();
extern void _ZN7S1478C3D0Ev();
extern void _ZN7S1478C42v5Ev();
extern void _ZN7S1478C42v6Ev();
extern void _ZN7S1478C42v7Ev();
extern void _ZN7S1478C42v8Ev();
extern void _ZN7S1478C42v9Ev();
extern void _ZN7S1478C43v10Ev();
extern void _ZN7S1478C43v11Ev();
extern void _ZN7S1478C43v12Ev();
extern void _ZN7S1478C43v13Ev();
extern void _ZN7S1478C43v14Ev();
extern void _ZN7S1478C33v15Ev();
extern void _ZN7S1478C33v16Ev();
extern void _ZN7S1478C33v17Ev();
extern void _ZN7S1478C33v18Ev();
extern void _ZN7S1478C33v19Ev();
static  VTBL_ENTRY vtc_S1478C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1478C3[0]),
  (VTBL_ENTRY)&_ZN7S1478C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1478C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v19Ev,
};
extern VTBL_ENTRY _ZTI7S1478C3[];
extern  VTBL_ENTRY _ZTV7S1478C3[];
Class_Descriptor cd_S1478C3 = {  "S1478C3", // class name
  bases_S1478C3, 1,
  &(vtc_S1478C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1478C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1478C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1478C2  : S1478C3 {
  char s1478c2f0;
  virtual void  v20(); // _ZN7S1478C23v20Ev
  virtual void  v21(); // _ZN7S1478C23v21Ev
  virtual void  v22(); // _ZN7S1478C23v22Ev
  virtual void  v23(); // _ZN7S1478C23v23Ev
  ~S1478C2(); // tgen
  S1478C2(); // tgen
};
//SIG(-1 S1478C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S1478C2 ::v20(){vfunc_called(this, "_ZN7S1478C23v20Ev");}
void  S1478C2 ::v21(){vfunc_called(this, "_ZN7S1478C23v21Ev");}
void  S1478C2 ::v22(){vfunc_called(this, "_ZN7S1478C23v22Ev");}
void  S1478C2 ::v23(){vfunc_called(this, "_ZN7S1478C23v23Ev");}
S1478C2 ::~S1478C2(){ note_dtor("S1478C2", this);} // tgen
S1478C2 ::S1478C2(){ note_ctor("S1478C2", this);} // tgen

static void Test_S1478C2()
{
  extern Class_Descriptor cd_S1478C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1478C2, buf);
    S1478C2 *dp, &lv = *(dp=new (buf) S1478C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1478C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1478C2)");
    check_base_class_offset(lv, (S1478C4*)(S1478C3*), 0, "S1478C2");
    check_base_class_offset(lv, (S1478C3*), 0, "S1478C2");
    check_field_offset(lv, s1478c2f0, ABISELECT(184,120), "S1478C2.s1478c2f0");
    test_class_info(&lv, &cd_S1478C2);
    dp->~S1478C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1478C2(Test_S1478C2, "S1478C2", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1478C2C1Ev();
extern void _ZN7S1478C2D1Ev();
Name_Map name_map_S1478C2[] = {
  NSPAIR(_ZN7S1478C2C1Ev),
  NSPAIR(_ZN7S1478C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1478C4;
extern VTBL_ENTRY _ZTI7S1478C4[];
extern  VTBL_ENTRY _ZTV7S1478C4[];
extern Class_Descriptor cd_S1478C3;
extern VTBL_ENTRY _ZTI7S1478C3[];
extern  VTBL_ENTRY _ZTV7S1478C3[];
static Base_Class bases_S1478C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1478C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1478C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1478C2[];
extern void _ZN7S1478C2D1Ev();
extern void _ZN7S1478C2D0Ev();
extern void _ZN7S1478C42v5Ev();
extern void _ZN7S1478C42v6Ev();
extern void _ZN7S1478C42v7Ev();
extern void _ZN7S1478C42v8Ev();
extern void _ZN7S1478C42v9Ev();
extern void _ZN7S1478C43v10Ev();
extern void _ZN7S1478C43v11Ev();
extern void _ZN7S1478C43v12Ev();
extern void _ZN7S1478C43v13Ev();
extern void _ZN7S1478C43v14Ev();
extern void _ZN7S1478C33v15Ev();
extern void _ZN7S1478C33v16Ev();
extern void _ZN7S1478C33v17Ev();
extern void _ZN7S1478C33v18Ev();
extern void _ZN7S1478C33v19Ev();
extern void _ZN7S1478C23v20Ev();
extern void _ZN7S1478C23v21Ev();
extern void _ZN7S1478C23v22Ev();
extern void _ZN7S1478C23v23Ev();
static  VTBL_ENTRY vtc_S1478C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1478C2[0]),
  (VTBL_ENTRY)&_ZN7S1478C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1478C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v23Ev,
};
extern VTBL_ENTRY _ZTI7S1478C2[];
extern  VTBL_ENTRY _ZTV7S1478C2[];
Class_Descriptor cd_S1478C2 = {  "S1478C2", // class name
  bases_S1478C2, 2,
  &(vtc_S1478C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1478C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1478C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1478C1  : S1478C2 {
  char s1478c1f0;
  virtual void  v1(); // _ZN7S1478C12v1Ev
  virtual void  v2(); // _ZN7S1478C12v2Ev
  virtual void  v3(); // _ZN7S1478C12v3Ev
  virtual void  v4(); // _ZN7S1478C12v4Ev
  ~S1478C1(); // tgen
  S1478C1(); // tgen
};
//SIG(1 S1478C1) C1{ BC2{ BC3{ BC4{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v20 v21 v22 v23 Fc} v1 v2 v3 v4 Fc}


void  S1478C1 ::v1(){vfunc_called(this, "_ZN7S1478C12v1Ev");}
void  S1478C1 ::v2(){vfunc_called(this, "_ZN7S1478C12v2Ev");}
void  S1478C1 ::v3(){vfunc_called(this, "_ZN7S1478C12v3Ev");}
void  S1478C1 ::v4(){vfunc_called(this, "_ZN7S1478C12v4Ev");}
S1478C1 ::~S1478C1(){ note_dtor("S1478C1", this);} // tgen
S1478C1 ::S1478C1(){ note_ctor("S1478C1", this);} // tgen

static void Test_S1478C1()
{
  extern Class_Descriptor cd_S1478C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1478C1, buf);
    S1478C1 *dp, &lv = *(dp=new (buf) S1478C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1478C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1478C1)");
    check_base_class_offset(lv, (S1478C4*)(S1478C3*)(S1478C2*), 0, "S1478C1");
    check_base_class_offset(lv, (S1478C3*)(S1478C2*), 0, "S1478C1");
    check_base_class_offset(lv, (S1478C2*), 0, "S1478C1");
    check_field_offset(lv, s1478c1f0, ABISELECT(185,121), "S1478C1.s1478c1f0");
    test_class_info(&lv, &cd_S1478C1);
    dp->~S1478C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1478C1(Test_S1478C1, "S1478C1", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1478C1C1Ev();
extern void _ZN7S1478C1D1Ev();
Name_Map name_map_S1478C1[] = {
  NSPAIR(_ZN7S1478C1C1Ev),
  NSPAIR(_ZN7S1478C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1478C4;
extern VTBL_ENTRY _ZTI7S1478C4[];
extern  VTBL_ENTRY _ZTV7S1478C4[];
extern Class_Descriptor cd_S1478C3;
extern VTBL_ENTRY _ZTI7S1478C3[];
extern  VTBL_ENTRY _ZTV7S1478C3[];
extern Class_Descriptor cd_S1478C2;
extern VTBL_ENTRY _ZTI7S1478C2[];
extern  VTBL_ENTRY _ZTV7S1478C2[];
static Base_Class bases_S1478C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1478C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1478C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1478C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1478C1[];
extern void _ZN7S1478C1D1Ev();
extern void _ZN7S1478C1D0Ev();
extern void _ZN7S1478C42v5Ev();
extern void _ZN7S1478C42v6Ev();
extern void _ZN7S1478C42v7Ev();
extern void _ZN7S1478C42v8Ev();
extern void _ZN7S1478C42v9Ev();
extern void _ZN7S1478C43v10Ev();
extern void _ZN7S1478C43v11Ev();
extern void _ZN7S1478C43v12Ev();
extern void _ZN7S1478C43v13Ev();
extern void _ZN7S1478C43v14Ev();
extern void _ZN7S1478C33v15Ev();
extern void _ZN7S1478C33v16Ev();
extern void _ZN7S1478C33v17Ev();
extern void _ZN7S1478C33v18Ev();
extern void _ZN7S1478C33v19Ev();
extern void _ZN7S1478C23v20Ev();
extern void _ZN7S1478C23v21Ev();
extern void _ZN7S1478C23v22Ev();
extern void _ZN7S1478C23v23Ev();
extern void _ZN7S1478C12v1Ev();
extern void _ZN7S1478C12v2Ev();
extern void _ZN7S1478C12v3Ev();
extern void _ZN7S1478C12v4Ev();
static  VTBL_ENTRY vtc_S1478C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1478C1[0]),
  (VTBL_ENTRY)&_ZN7S1478C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1478C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1478C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1478C43v14Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1478C33v19Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1478C23v23Ev,
  (VTBL_ENTRY)&_ZN7S1478C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1478C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1478C12v3Ev,
  (VTBL_ENTRY)&_ZN7S1478C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S1478C1[];
extern  VTBL_ENTRY _ZTV7S1478C1[];
Class_Descriptor cd_S1478C1 = {  "S1478C1", // class name
  bases_S1478C1, 3,
  &(vtc_S1478C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1478C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1478C1),27, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3306C3  {
  void *s3306c3f0[2];
  ::S10103C13_nt s3306c3f1;
  void *s3306c3f2;
  virtual  ~S3306C3(); // _ZN7S3306C3D1Ev
  virtual void  v5(); // _ZN7S3306C32v5Ev
  virtual void  v6(); // _ZN7S3306C32v6Ev
  virtual void  v7(); // _ZN7S3306C32v7Ev
  virtual void  v8(); // _ZN7S3306C32v8Ev
  virtual void  v9(); // _ZN7S3306C32v9Ev
  virtual void  v10(); // _ZN7S3306C33v10Ev
  virtual void  v11(); // _ZN7S3306C33v11Ev
  virtual void  v12(); // _ZN7S3306C33v12Ev
  virtual void  v13(); // _ZN7S3306C33v13Ev
  virtual void  v14(); // _ZN7S3306C33v14Ev
  S3306C3(); // tgen
};
//SIG(-1 S3306C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3306C3 ::~S3306C3(){ note_dtor("S3306C3", this);}
void  S3306C3 ::v5(){vfunc_called(this, "_ZN7S3306C32v5Ev");}
void  S3306C3 ::v6(){vfunc_called(this, "_ZN7S3306C32v6Ev");}
void  S3306C3 ::v7(){vfunc_called(this, "_ZN7S3306C32v7Ev");}
void  S3306C3 ::v8(){vfunc_called(this, "_ZN7S3306C32v8Ev");}
void  S3306C3 ::v9(){vfunc_called(this, "_ZN7S3306C32v9Ev");}
void  S3306C3 ::v10(){vfunc_called(this, "_ZN7S3306C33v10Ev");}
void  S3306C3 ::v11(){vfunc_called(this, "_ZN7S3306C33v11Ev");}
void  S3306C3 ::v12(){vfunc_called(this, "_ZN7S3306C33v12Ev");}
void  S3306C3 ::v13(){vfunc_called(this, "_ZN7S3306C33v13Ev");}
void  S3306C3 ::v14(){vfunc_called(this, "_ZN7S3306C33v14Ev");}
S3306C3 ::S3306C3(){ note_ctor("S3306C3", this);} // tgen

static void Test_S3306C3()
{
  extern Class_Descriptor cd_S3306C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3306C3, buf);
    S3306C3 *dp, &lv = *(dp=new (buf) S3306C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3306C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3306C3)");
    check_field_offset(lv, s3306c3f0, ABISELECT(8,4), "S3306C3.s3306c3f0");
    check_field_offset(lv, s3306c3f1, ABISELECT(24,12), "S3306C3.s3306c3f1");
    check_field_offset(lv, s3306c3f2, ABISELECT(48,28), "S3306C3.s3306c3f2");
    test_class_info(&lv, &cd_S3306C3);
    dp->~S3306C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3306C3(Test_S3306C3, "S3306C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3306C3C1Ev();
extern void _ZN7S3306C3D1Ev();
Name_Map name_map_S3306C3[] = {
  NSPAIR(_ZN7S3306C3C1Ev),
  NSPAIR(_ZN7S3306C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3306C3[];
extern void _ZN7S3306C3D1Ev();
extern void _ZN7S3306C3D0Ev();
extern void _ZN7S3306C32v5Ev();
extern void _ZN7S3306C32v6Ev();
extern void _ZN7S3306C32v7Ev();
extern void _ZN7S3306C32v8Ev();
extern void _ZN7S3306C32v9Ev();
extern void _ZN7S3306C33v10Ev();
extern void _ZN7S3306C33v11Ev();
extern void _ZN7S3306C33v12Ev();
extern void _ZN7S3306C33v13Ev();
extern void _ZN7S3306C33v14Ev();
static  VTBL_ENTRY vtc_S3306C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3306C3[0]),
  (VTBL_ENTRY)&_ZN7S3306C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3306C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3306C3[];
extern  VTBL_ENTRY _ZTV7S3306C3[];
Class_Descriptor cd_S3306C3 = {  "S3306C3", // class name
  0,0,//no base classes
  &(vtc_S3306C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3306C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3306C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3306C2  : S3306C3 {
  void *s3306c2f0;
  ::S10103C13_nt s3306c2f1;
  ::S10103C13_nt s3306c2f2;
  ::S10103C13_nt s3306c2f3;
  ::S10103C86 s3306c2f4;
  ::S10103C86 s3306c2f5;
  ::S10103C86 s3306c2f6;
  virtual  ~S3306C2(); // _ZN7S3306C2D1Ev
  virtual void  v15(); // _ZN7S3306C23v15Ev
  virtual void  v16(); // _ZN7S3306C23v16Ev
  virtual void  v17(); // _ZN7S3306C23v17Ev
  virtual void  v18(); // _ZN7S3306C23v18Ev
  virtual void  v19(); // _ZN7S3306C23v19Ev
  S3306C2(); // tgen
};
//SIG(-1 S3306C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3306C2 ::~S3306C2(){ note_dtor("S3306C2", this);}
void  S3306C2 ::v15(){vfunc_called(this, "_ZN7S3306C23v15Ev");}
void  S3306C2 ::v16(){vfunc_called(this, "_ZN7S3306C23v16Ev");}
void  S3306C2 ::v17(){vfunc_called(this, "_ZN7S3306C23v17Ev");}
void  S3306C2 ::v18(){vfunc_called(this, "_ZN7S3306C23v18Ev");}
void  S3306C2 ::v19(){vfunc_called(this, "_ZN7S3306C23v19Ev");}
S3306C2 ::S3306C2(){ note_ctor("S3306C2", this);} // tgen

static void Test_S3306C2()
{
  extern Class_Descriptor cd_S3306C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3306C2, buf);
    S3306C2 *dp, &lv = *(dp=new (buf) S3306C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3306C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3306C2)");
    check_base_class_offset(lv, (S3306C3*), 0, "S3306C2");
    check_field_offset(lv, s3306c2f0, ABISELECT(56,32), "S3306C2.s3306c2f0");
    check_field_offset(lv, s3306c2f1, ABISELECT(64,36), "S3306C2.s3306c2f1");
    check_field_offset(lv, s3306c2f2, ABISELECT(88,52), "S3306C2.s3306c2f2");
    check_field_offset(lv, s3306c2f3, ABISELECT(112,68), "S3306C2.s3306c2f3");
    check_field_offset(lv, s3306c2f4, ABISELECT(136,84), "S3306C2.s3306c2f4");
    check_field_offset(lv, s3306c2f5, ABISELECT(152,96), "S3306C2.s3306c2f5");
    check_field_offset(lv, s3306c2f6, ABISELECT(168,108), "S3306C2.s3306c2f6");
    test_class_info(&lv, &cd_S3306C2);
    dp->~S3306C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3306C2(Test_S3306C2, "S3306C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3306C2C1Ev();
extern void _ZN7S3306C2D1Ev();
Name_Map name_map_S3306C2[] = {
  NSPAIR(_ZN7S3306C2C1Ev),
  NSPAIR(_ZN7S3306C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3306C3;
extern VTBL_ENTRY _ZTI7S3306C3[];
extern  VTBL_ENTRY _ZTV7S3306C3[];
static Base_Class bases_S3306C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3306C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3306C2[];
extern void _ZN7S3306C2D1Ev();
extern void _ZN7S3306C2D0Ev();
extern void _ZN7S3306C32v5Ev();
extern void _ZN7S3306C32v6Ev();
extern void _ZN7S3306C32v7Ev();
extern void _ZN7S3306C32v8Ev();
extern void _ZN7S3306C32v9Ev();
extern void _ZN7S3306C33v10Ev();
extern void _ZN7S3306C33v11Ev();
extern void _ZN7S3306C33v12Ev();
extern void _ZN7S3306C33v13Ev();
extern void _ZN7S3306C33v14Ev();
extern void _ZN7S3306C23v15Ev();
extern void _ZN7S3306C23v16Ev();
extern void _ZN7S3306C23v17Ev();
extern void _ZN7S3306C23v18Ev();
extern void _ZN7S3306C23v19Ev();
static  VTBL_ENTRY vtc_S3306C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3306C2[0]),
  (VTBL_ENTRY)&_ZN7S3306C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3306C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3306C2[];
extern  VTBL_ENTRY _ZTV7S3306C2[];
Class_Descriptor cd_S3306C2 = {  "S3306C2", // class name
  bases_S3306C2, 1,
  &(vtc_S3306C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3306C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3306C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3306C1  : S3306C2 {
  ::S10103C14_nt s3306c1f0;
  int s3306c1f1[4];
  virtual void  v1(); // _ZN7S3306C12v1Ev
  virtual void  v2(); // _ZN7S3306C12v2Ev
  virtual void  v3(); // _ZN7S3306C12v3Ev
  virtual void  v4(); // _ZN7S3306C12v4Ev
  ~S3306C1(); // tgen
  S3306C1(); // tgen
};
//SIG(1 S3306C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 FC5 Fi[4]}


void  S3306C1 ::v1(){vfunc_called(this, "_ZN7S3306C12v1Ev");}
void  S3306C1 ::v2(){vfunc_called(this, "_ZN7S3306C12v2Ev");}
void  S3306C1 ::v3(){vfunc_called(this, "_ZN7S3306C12v3Ev");}
void  S3306C1 ::v4(){vfunc_called(this, "_ZN7S3306C12v4Ev");}
S3306C1 ::~S3306C1(){ note_dtor("S3306C1", this);} // tgen
S3306C1 ::S3306C1(){ note_ctor("S3306C1", this);} // tgen

static void Test_S3306C1()
{
  extern Class_Descriptor cd_S3306C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,38)];
    init_test(&cd_S3306C1, buf);
    S3306C1 *dp, &lv = *(dp=new (buf) S3306C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,148), "sizeof(S3306C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3306C1)");
    check_base_class_offset(lv, (S3306C3*)(S3306C2*), 0, "S3306C1");
    check_base_class_offset(lv, (S3306C2*), 0, "S3306C1");
    check_field_offset(lv, s3306c1f0, ABISELECT(184,120), "S3306C1.s3306c1f0");
    check_field_offset(lv, s3306c1f1, ABISELECT(200,132), "S3306C1.s3306c1f1");
    test_class_info(&lv, &cd_S3306C1);
    dp->~S3306C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3306C1(Test_S3306C1, "S3306C1", ABISELECT(216,148));

#else // __cplusplus

extern void _ZN7S3306C1C1Ev();
extern void _ZN7S3306C1D1Ev();
Name_Map name_map_S3306C1[] = {
  NSPAIR(_ZN7S3306C1C1Ev),
  NSPAIR(_ZN7S3306C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3306C3;
extern VTBL_ENTRY _ZTI7S3306C3[];
extern  VTBL_ENTRY _ZTV7S3306C3[];
extern Class_Descriptor cd_S3306C2;
extern VTBL_ENTRY _ZTI7S3306C2[];
extern  VTBL_ENTRY _ZTV7S3306C2[];
static Base_Class bases_S3306C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3306C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3306C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3306C1[];
extern void _ZN7S3306C1D1Ev();
extern void _ZN7S3306C1D0Ev();
extern void _ZN7S3306C32v5Ev();
extern void _ZN7S3306C32v6Ev();
extern void _ZN7S3306C32v7Ev();
extern void _ZN7S3306C32v8Ev();
extern void _ZN7S3306C32v9Ev();
extern void _ZN7S3306C33v10Ev();
extern void _ZN7S3306C33v11Ev();
extern void _ZN7S3306C33v12Ev();
extern void _ZN7S3306C33v13Ev();
extern void _ZN7S3306C33v14Ev();
extern void _ZN7S3306C23v15Ev();
extern void _ZN7S3306C23v16Ev();
extern void _ZN7S3306C23v17Ev();
extern void _ZN7S3306C23v18Ev();
extern void _ZN7S3306C23v19Ev();
extern void _ZN7S3306C12v1Ev();
extern void _ZN7S3306C12v2Ev();
extern void _ZN7S3306C12v3Ev();
extern void _ZN7S3306C12v4Ev();
static  VTBL_ENTRY vtc_S3306C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3306C1[0]),
  (VTBL_ENTRY)&_ZN7S3306C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3306C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3306C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3306C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3306C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3306C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3306C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3306C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3306C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3306C1[];
extern  VTBL_ENTRY _ZTV7S3306C1[];
Class_Descriptor cd_S3306C1 = {  "S3306C1", // class name
  bases_S3306C1, 2,
  &(vtc_S3306C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,148), // object size
  NSPAIRA(_ZTI7S3306C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3306C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1443C4  {
  void *s1443c4f0[2];
  ::S10103C13_nt s1443c4f1;
  void *s1443c4f2;
  virtual  ~S1443C4(); // _ZN7S1443C4D1Ev
  virtual void  v4(); // _ZN7S1443C42v4Ev
  virtual void  v5(); // _ZN7S1443C42v5Ev
  virtual void  v6(); // _ZN7S1443C42v6Ev
  virtual void  v7(); // _ZN7S1443C42v7Ev
  virtual void  v8(); // _ZN7S1443C42v8Ev
  virtual void  v9(); // _ZN7S1443C42v9Ev
  virtual void  v10(); // _ZN7S1443C43v10Ev
  virtual void  v11(); // _ZN7S1443C43v11Ev
  virtual void  v12(); // _ZN7S1443C43v12Ev
  virtual void  v13(); // _ZN7S1443C43v13Ev
  S1443C4(); // tgen
};
//SIG(-1 S1443C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1443C4 ::~S1443C4(){ note_dtor("S1443C4", this);}
void  S1443C4 ::v4(){vfunc_called(this, "_ZN7S1443C42v4Ev");}
void  S1443C4 ::v5(){vfunc_called(this, "_ZN7S1443C42v5Ev");}
void  S1443C4 ::v6(){vfunc_called(this, "_ZN7S1443C42v6Ev");}
void  S1443C4 ::v7(){vfunc_called(this, "_ZN7S1443C42v7Ev");}
void  S1443C4 ::v8(){vfunc_called(this, "_ZN7S1443C42v8Ev");}
void  S1443C4 ::v9(){vfunc_called(this, "_ZN7S1443C42v9Ev");}
void  S1443C4 ::v10(){vfunc_called(this, "_ZN7S1443C43v10Ev");}
void  S1443C4 ::v11(){vfunc_called(this, "_ZN7S1443C43v11Ev");}
void  S1443C4 ::v12(){vfunc_called(this, "_ZN7S1443C43v12Ev");}
void  S1443C4 ::v13(){vfunc_called(this, "_ZN7S1443C43v13Ev");}
S1443C4 ::S1443C4(){ note_ctor("S1443C4", this);} // tgen

static void Test_S1443C4()
{
  extern Class_Descriptor cd_S1443C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1443C4, buf);
    S1443C4 *dp, &lv = *(dp=new (buf) S1443C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1443C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1443C4)");
    check_field_offset(lv, s1443c4f0, ABISELECT(8,4), "S1443C4.s1443c4f0");
    check_field_offset(lv, s1443c4f1, ABISELECT(24,12), "S1443C4.s1443c4f1");
    check_field_offset(lv, s1443c4f2, ABISELECT(48,28), "S1443C4.s1443c4f2");
    test_class_info(&lv, &cd_S1443C4);
    dp->~S1443C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1443C4(Test_S1443C4, "S1443C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1443C4C1Ev();
extern void _ZN7S1443C4D1Ev();
Name_Map name_map_S1443C4[] = {
  NSPAIR(_ZN7S1443C4C1Ev),
  NSPAIR(_ZN7S1443C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1443C4[];
extern void _ZN7S1443C4D1Ev();
extern void _ZN7S1443C4D0Ev();
extern void _ZN7S1443C42v4Ev();
extern void _ZN7S1443C42v5Ev();
extern void _ZN7S1443C42v6Ev();
extern void _ZN7S1443C42v7Ev();
extern void _ZN7S1443C42v8Ev();
extern void _ZN7S1443C42v9Ev();
extern void _ZN7S1443C43v10Ev();
extern void _ZN7S1443C43v11Ev();
extern void _ZN7S1443C43v12Ev();
extern void _ZN7S1443C43v13Ev();
static  VTBL_ENTRY vtc_S1443C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1443C4[0]),
  (VTBL_ENTRY)&_ZN7S1443C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1443C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v13Ev,
};
extern VTBL_ENTRY _ZTI7S1443C4[];
extern  VTBL_ENTRY _ZTV7S1443C4[];
Class_Descriptor cd_S1443C4 = {  "S1443C4", // class name
  0,0,//no base classes
  &(vtc_S1443C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1443C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1443C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1443C3  : S1443C4 {
  void *s1443c3f0;
  ::S10103C13_nt s1443c3f1;
  ::S10103C13_nt s1443c3f2;
  ::S10103C13_nt s1443c3f3;
  ::S10103C86 s1443c3f4;
  ::S10103C86 s1443c3f5;
  ::S10103C86 s1443c3f6;
  virtual  ~S1443C3(); // _ZN7S1443C3D1Ev
  virtual void  v14(); // _ZN7S1443C33v14Ev
  virtual void  v15(); // _ZN7S1443C33v15Ev
  virtual void  v16(); // _ZN7S1443C33v16Ev
  virtual void  v17(); // _ZN7S1443C33v17Ev
  virtual void  v18(); // _ZN7S1443C33v18Ev
  S1443C3(); // tgen
};
//SIG(-1 S1443C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1443C3 ::~S1443C3(){ note_dtor("S1443C3", this);}
void  S1443C3 ::v14(){vfunc_called(this, "_ZN7S1443C33v14Ev");}
void  S1443C3 ::v15(){vfunc_called(this, "_ZN7S1443C33v15Ev");}
void  S1443C3 ::v16(){vfunc_called(this, "_ZN7S1443C33v16Ev");}
void  S1443C3 ::v17(){vfunc_called(this, "_ZN7S1443C33v17Ev");}
void  S1443C3 ::v18(){vfunc_called(this, "_ZN7S1443C33v18Ev");}
S1443C3 ::S1443C3(){ note_ctor("S1443C3", this);} // tgen

static void Test_S1443C3()
{
  extern Class_Descriptor cd_S1443C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1443C3, buf);
    S1443C3 *dp, &lv = *(dp=new (buf) S1443C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1443C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1443C3)");
    check_base_class_offset(lv, (S1443C4*), 0, "S1443C3");
    check_field_offset(lv, s1443c3f0, ABISELECT(56,32), "S1443C3.s1443c3f0");
    check_field_offset(lv, s1443c3f1, ABISELECT(64,36), "S1443C3.s1443c3f1");
    check_field_offset(lv, s1443c3f2, ABISELECT(88,52), "S1443C3.s1443c3f2");
    check_field_offset(lv, s1443c3f3, ABISELECT(112,68), "S1443C3.s1443c3f3");
    check_field_offset(lv, s1443c3f4, ABISELECT(136,84), "S1443C3.s1443c3f4");
    check_field_offset(lv, s1443c3f5, ABISELECT(152,96), "S1443C3.s1443c3f5");
    check_field_offset(lv, s1443c3f6, ABISELECT(168,108), "S1443C3.s1443c3f6");
    test_class_info(&lv, &cd_S1443C3);
    dp->~S1443C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1443C3(Test_S1443C3, "S1443C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1443C3C1Ev();
extern void _ZN7S1443C3D1Ev();
Name_Map name_map_S1443C3[] = {
  NSPAIR(_ZN7S1443C3C1Ev),
  NSPAIR(_ZN7S1443C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1443C4;
extern VTBL_ENTRY _ZTI7S1443C4[];
extern  VTBL_ENTRY _ZTV7S1443C4[];
static Base_Class bases_S1443C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1443C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1443C3[];
extern void _ZN7S1443C3D1Ev();
extern void _ZN7S1443C3D0Ev();
extern void _ZN7S1443C42v4Ev();
extern void _ZN7S1443C42v5Ev();
extern void _ZN7S1443C42v6Ev();
extern void _ZN7S1443C42v7Ev();
extern void _ZN7S1443C42v8Ev();
extern void _ZN7S1443C42v9Ev();
extern void _ZN7S1443C43v10Ev();
extern void _ZN7S1443C43v11Ev();
extern void _ZN7S1443C43v12Ev();
extern void _ZN7S1443C43v13Ev();
extern void _ZN7S1443C33v14Ev();
extern void _ZN7S1443C33v15Ev();
extern void _ZN7S1443C33v16Ev();
extern void _ZN7S1443C33v17Ev();
extern void _ZN7S1443C33v18Ev();
static  VTBL_ENTRY vtc_S1443C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1443C3[0]),
  (VTBL_ENTRY)&_ZN7S1443C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1443C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v18Ev,
};
extern VTBL_ENTRY _ZTI7S1443C3[];
extern  VTBL_ENTRY _ZTV7S1443C3[];
Class_Descriptor cd_S1443C3 = {  "S1443C3", // class name
  bases_S1443C3, 1,
  &(vtc_S1443C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1443C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1443C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1443C2  : S1443C3 {
  int s1443c2f0;
  virtual void  v19(); // _ZN7S1443C23v19Ev
  virtual void  v20(); // _ZN7S1443C23v20Ev
  virtual void  v21(); // _ZN7S1443C23v21Ev
  virtual void  v22(); // _ZN7S1443C23v22Ev
  ~S1443C2(); // tgen
  S1443C2(); // tgen
};
//SIG(-1 S1443C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fi}


void  S1443C2 ::v19(){vfunc_called(this, "_ZN7S1443C23v19Ev");}
void  S1443C2 ::v20(){vfunc_called(this, "_ZN7S1443C23v20Ev");}
void  S1443C2 ::v21(){vfunc_called(this, "_ZN7S1443C23v21Ev");}
void  S1443C2 ::v22(){vfunc_called(this, "_ZN7S1443C23v22Ev");}
S1443C2 ::~S1443C2(){ note_dtor("S1443C2", this);} // tgen
S1443C2 ::S1443C2(){ note_ctor("S1443C2", this);} // tgen

static void Test_S1443C2()
{
  extern Class_Descriptor cd_S1443C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1443C2, buf);
    S1443C2 *dp, &lv = *(dp=new (buf) S1443C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1443C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1443C2)");
    check_base_class_offset(lv, (S1443C4*)(S1443C3*), 0, "S1443C2");
    check_base_class_offset(lv, (S1443C3*), 0, "S1443C2");
    check_field_offset(lv, s1443c2f0, ABISELECT(184,120), "S1443C2.s1443c2f0");
    test_class_info(&lv, &cd_S1443C2);
    dp->~S1443C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1443C2(Test_S1443C2, "S1443C2", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1443C2C1Ev();
extern void _ZN7S1443C2D1Ev();
Name_Map name_map_S1443C2[] = {
  NSPAIR(_ZN7S1443C2C1Ev),
  NSPAIR(_ZN7S1443C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1443C4;
extern VTBL_ENTRY _ZTI7S1443C4[];
extern  VTBL_ENTRY _ZTV7S1443C4[];
extern Class_Descriptor cd_S1443C3;
extern VTBL_ENTRY _ZTI7S1443C3[];
extern  VTBL_ENTRY _ZTV7S1443C3[];
static Base_Class bases_S1443C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1443C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1443C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1443C2[];
extern void _ZN7S1443C2D1Ev();
extern void _ZN7S1443C2D0Ev();
extern void _ZN7S1443C42v4Ev();
extern void _ZN7S1443C42v5Ev();
extern void _ZN7S1443C42v6Ev();
extern void _ZN7S1443C42v7Ev();
extern void _ZN7S1443C42v8Ev();
extern void _ZN7S1443C42v9Ev();
extern void _ZN7S1443C43v10Ev();
extern void _ZN7S1443C43v11Ev();
extern void _ZN7S1443C43v12Ev();
extern void _ZN7S1443C43v13Ev();
extern void _ZN7S1443C33v14Ev();
extern void _ZN7S1443C33v15Ev();
extern void _ZN7S1443C33v16Ev();
extern void _ZN7S1443C33v17Ev();
extern void _ZN7S1443C33v18Ev();
extern void _ZN7S1443C23v19Ev();
extern void _ZN7S1443C23v20Ev();
extern void _ZN7S1443C23v21Ev();
extern void _ZN7S1443C23v22Ev();
static  VTBL_ENTRY vtc_S1443C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1443C2[0]),
  (VTBL_ENTRY)&_ZN7S1443C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1443C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v22Ev,
};
extern VTBL_ENTRY _ZTI7S1443C2[];
extern  VTBL_ENTRY _ZTV7S1443C2[];
Class_Descriptor cd_S1443C2 = {  "S1443C2", // class name
  bases_S1443C2, 2,
  &(vtc_S1443C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1443C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1443C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1443C1  : S1443C2 {
  void *s1443c1f0;
  virtual  ~S1443C1(); // _ZN7S1443C1D1Ev
  virtual void  v1(); // _ZN7S1443C12v1Ev
  virtual void  v2(); // _ZN7S1443C12v2Ev
  virtual void  v3(); // _ZN7S1443C12v3Ev
  S1443C1(); // tgen
};
//SIG(1 S1443C1) C1{ BC2{ BC3{ BC4{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v19 v20 v21 v22 Fi} vd v1 v2 v3 Fp}


 S1443C1 ::~S1443C1(){ note_dtor("S1443C1", this);}
void  S1443C1 ::v1(){vfunc_called(this, "_ZN7S1443C12v1Ev");}
void  S1443C1 ::v2(){vfunc_called(this, "_ZN7S1443C12v2Ev");}
void  S1443C1 ::v3(){vfunc_called(this, "_ZN7S1443C12v3Ev");}
S1443C1 ::S1443C1(){ note_ctor("S1443C1", this);} // tgen

static void Test_S1443C1()
{
  extern Class_Descriptor cd_S1443C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(26,33)];
    init_test(&cd_S1443C1, buf);
    S1443C1 *dp, &lv = *(dp=new (buf) S1443C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(200,128), "sizeof(S1443C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1443C1)");
    check_base_class_offset(lv, (S1443C4*)(S1443C3*)(S1443C2*), 0, "S1443C1");
    check_base_class_offset(lv, (S1443C3*)(S1443C2*), 0, "S1443C1");
    check_base_class_offset(lv, (S1443C2*), 0, "S1443C1");
    check_field_offset(lv, s1443c1f0, ABISELECT(192,124), "S1443C1.s1443c1f0");
    test_class_info(&lv, &cd_S1443C1);
    dp->~S1443C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1443C1(Test_S1443C1, "S1443C1", ABISELECT(200,128));

#else // __cplusplus

extern void _ZN7S1443C1C1Ev();
extern void _ZN7S1443C1D1Ev();
Name_Map name_map_S1443C1[] = {
  NSPAIR(_ZN7S1443C1C1Ev),
  NSPAIR(_ZN7S1443C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1443C4;
extern VTBL_ENTRY _ZTI7S1443C4[];
extern  VTBL_ENTRY _ZTV7S1443C4[];
extern Class_Descriptor cd_S1443C3;
extern VTBL_ENTRY _ZTI7S1443C3[];
extern  VTBL_ENTRY _ZTV7S1443C3[];
extern Class_Descriptor cd_S1443C2;
extern VTBL_ENTRY _ZTI7S1443C2[];
extern  VTBL_ENTRY _ZTV7S1443C2[];
static Base_Class bases_S1443C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1443C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1443C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1443C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1443C1[];
extern void _ZN7S1443C1D1Ev();
extern void _ZN7S1443C1D0Ev();
extern void _ZN7S1443C42v4Ev();
extern void _ZN7S1443C42v5Ev();
extern void _ZN7S1443C42v6Ev();
extern void _ZN7S1443C42v7Ev();
extern void _ZN7S1443C42v8Ev();
extern void _ZN7S1443C42v9Ev();
extern void _ZN7S1443C43v10Ev();
extern void _ZN7S1443C43v11Ev();
extern void _ZN7S1443C43v12Ev();
extern void _ZN7S1443C43v13Ev();
extern void _ZN7S1443C33v14Ev();
extern void _ZN7S1443C33v15Ev();
extern void _ZN7S1443C33v16Ev();
extern void _ZN7S1443C33v17Ev();
extern void _ZN7S1443C33v18Ev();
extern void _ZN7S1443C23v19Ev();
extern void _ZN7S1443C23v20Ev();
extern void _ZN7S1443C23v21Ev();
extern void _ZN7S1443C23v22Ev();
extern void _ZN7S1443C12v1Ev();
extern void _ZN7S1443C12v2Ev();
extern void _ZN7S1443C12v3Ev();
static  VTBL_ENTRY vtc_S1443C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1443C1[0]),
  (VTBL_ENTRY)&_ZN7S1443C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1443C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1443C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1443C43v13Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1443C33v18Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1443C23v22Ev,
  (VTBL_ENTRY)&_ZN7S1443C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1443C12v2Ev,
  (VTBL_ENTRY)&_ZN7S1443C12v3Ev,
};
extern VTBL_ENTRY _ZTI7S1443C1[];
extern  VTBL_ENTRY _ZTV7S1443C1[];
Class_Descriptor cd_S1443C1 = {  "S1443C1", // class name
  bases_S1443C1, 3,
  &(vtc_S1443C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(200,128), // object size
  NSPAIRA(_ZTI7S1443C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1443C1),26, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1385C4  {
  void *s1385c4f0[2];
  ::S10103C13_nt s1385c4f1;
  void *s1385c4f2;
  virtual  ~S1385C4(); // _ZN7S1385C4D1Ev
  virtual void  v3(); // _ZN7S1385C42v3Ev
  virtual void  v4(); // _ZN7S1385C42v4Ev
  virtual void  v5(); // _ZN7S1385C42v5Ev
  virtual void  v6(); // _ZN7S1385C42v6Ev
  virtual void  v7(); // _ZN7S1385C42v7Ev
  virtual void  v8(); // _ZN7S1385C42v8Ev
  virtual void  v9(); // _ZN7S1385C42v9Ev
  virtual void  v10(); // _ZN7S1385C43v10Ev
  virtual void  v11(); // _ZN7S1385C43v11Ev
  virtual void  v12(); // _ZN7S1385C43v12Ev
  S1385C4(); // tgen
};
//SIG(-1 S1385C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1385C4 ::~S1385C4(){ note_dtor("S1385C4", this);}
void  S1385C4 ::v3(){vfunc_called(this, "_ZN7S1385C42v3Ev");}
void  S1385C4 ::v4(){vfunc_called(this, "_ZN7S1385C42v4Ev");}
void  S1385C4 ::v5(){vfunc_called(this, "_ZN7S1385C42v5Ev");}
void  S1385C4 ::v6(){vfunc_called(this, "_ZN7S1385C42v6Ev");}
void  S1385C4 ::v7(){vfunc_called(this, "_ZN7S1385C42v7Ev");}
void  S1385C4 ::v8(){vfunc_called(this, "_ZN7S1385C42v8Ev");}
void  S1385C4 ::v9(){vfunc_called(this, "_ZN7S1385C42v9Ev");}
void  S1385C4 ::v10(){vfunc_called(this, "_ZN7S1385C43v10Ev");}
void  S1385C4 ::v11(){vfunc_called(this, "_ZN7S1385C43v11Ev");}
void  S1385C4 ::v12(){vfunc_called(this, "_ZN7S1385C43v12Ev");}
S1385C4 ::S1385C4(){ note_ctor("S1385C4", this);} // tgen

static void Test_S1385C4()
{
  extern Class_Descriptor cd_S1385C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1385C4, buf);
    S1385C4 *dp, &lv = *(dp=new (buf) S1385C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1385C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1385C4)");
    check_field_offset(lv, s1385c4f0, ABISELECT(8,4), "S1385C4.s1385c4f0");
    check_field_offset(lv, s1385c4f1, ABISELECT(24,12), "S1385C4.s1385c4f1");
    check_field_offset(lv, s1385c4f2, ABISELECT(48,28), "S1385C4.s1385c4f2");
    test_class_info(&lv, &cd_S1385C4);
    dp->~S1385C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1385C4(Test_S1385C4, "S1385C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1385C4C1Ev();
extern void _ZN7S1385C4D1Ev();
Name_Map name_map_S1385C4[] = {
  NSPAIR(_ZN7S1385C4C1Ev),
  NSPAIR(_ZN7S1385C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1385C4[];
extern void _ZN7S1385C4D1Ev();
extern void _ZN7S1385C4D0Ev();
extern void _ZN7S1385C42v3Ev();
extern void _ZN7S1385C42v4Ev();
extern void _ZN7S1385C42v5Ev();
extern void _ZN7S1385C42v6Ev();
extern void _ZN7S1385C42v7Ev();
extern void _ZN7S1385C42v8Ev();
extern void _ZN7S1385C42v9Ev();
extern void _ZN7S1385C43v10Ev();
extern void _ZN7S1385C43v11Ev();
extern void _ZN7S1385C43v12Ev();
static  VTBL_ENTRY vtc_S1385C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1385C4[0]),
  (VTBL_ENTRY)&_ZN7S1385C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1385C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v12Ev,
};
extern VTBL_ENTRY _ZTI7S1385C4[];
extern  VTBL_ENTRY _ZTV7S1385C4[];
Class_Descriptor cd_S1385C4 = {  "S1385C4", // class name
  0,0,//no base classes
  &(vtc_S1385C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1385C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1385C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1385C3  : S1385C4 {
  void *s1385c3f0;
  ::S10103C13_nt s1385c3f1;
  ::S10103C13_nt s1385c3f2;
  ::S10103C13_nt s1385c3f3;
  ::S10103C86 s1385c3f4;
  ::S10103C86 s1385c3f5;
  ::S10103C86 s1385c3f6;
  virtual  ~S1385C3(); // _ZN7S1385C3D1Ev
  virtual void  v13(); // _ZN7S1385C33v13Ev
  virtual void  v14(); // _ZN7S1385C33v14Ev
  virtual void  v15(); // _ZN7S1385C33v15Ev
  virtual void  v16(); // _ZN7S1385C33v16Ev
  virtual void  v17(); // _ZN7S1385C33v17Ev
  S1385C3(); // tgen
};
//SIG(-1 S1385C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1385C3 ::~S1385C3(){ note_dtor("S1385C3", this);}
void  S1385C3 ::v13(){vfunc_called(this, "_ZN7S1385C33v13Ev");}
void  S1385C3 ::v14(){vfunc_called(this, "_ZN7S1385C33v14Ev");}
void  S1385C3 ::v15(){vfunc_called(this, "_ZN7S1385C33v15Ev");}
void  S1385C3 ::v16(){vfunc_called(this, "_ZN7S1385C33v16Ev");}
void  S1385C3 ::v17(){vfunc_called(this, "_ZN7S1385C33v17Ev");}
S1385C3 ::S1385C3(){ note_ctor("S1385C3", this);} // tgen

static void Test_S1385C3()
{
  extern Class_Descriptor cd_S1385C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1385C3, buf);
    S1385C3 *dp, &lv = *(dp=new (buf) S1385C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1385C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1385C3)");
    check_base_class_offset(lv, (S1385C4*), 0, "S1385C3");
    check_field_offset(lv, s1385c3f0, ABISELECT(56,32), "S1385C3.s1385c3f0");
    check_field_offset(lv, s1385c3f1, ABISELECT(64,36), "S1385C3.s1385c3f1");
    check_field_offset(lv, s1385c3f2, ABISELECT(88,52), "S1385C3.s1385c3f2");
    check_field_offset(lv, s1385c3f3, ABISELECT(112,68), "S1385C3.s1385c3f3");
    check_field_offset(lv, s1385c3f4, ABISELECT(136,84), "S1385C3.s1385c3f4");
    check_field_offset(lv, s1385c3f5, ABISELECT(152,96), "S1385C3.s1385c3f5");
    check_field_offset(lv, s1385c3f6, ABISELECT(168,108), "S1385C3.s1385c3f6");
    test_class_info(&lv, &cd_S1385C3);
    dp->~S1385C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1385C3(Test_S1385C3, "S1385C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1385C3C1Ev();
extern void _ZN7S1385C3D1Ev();
Name_Map name_map_S1385C3[] = {
  NSPAIR(_ZN7S1385C3C1Ev),
  NSPAIR(_ZN7S1385C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1385C4;
extern VTBL_ENTRY _ZTI7S1385C4[];
extern  VTBL_ENTRY _ZTV7S1385C4[];
static Base_Class bases_S1385C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1385C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1385C3[];
extern void _ZN7S1385C3D1Ev();
extern void _ZN7S1385C3D0Ev();
extern void _ZN7S1385C42v3Ev();
extern void _ZN7S1385C42v4Ev();
extern void _ZN7S1385C42v5Ev();
extern void _ZN7S1385C42v6Ev();
extern void _ZN7S1385C42v7Ev();
extern void _ZN7S1385C42v8Ev();
extern void _ZN7S1385C42v9Ev();
extern void _ZN7S1385C43v10Ev();
extern void _ZN7S1385C43v11Ev();
extern void _ZN7S1385C43v12Ev();
extern void _ZN7S1385C33v13Ev();
extern void _ZN7S1385C33v14Ev();
extern void _ZN7S1385C33v15Ev();
extern void _ZN7S1385C33v16Ev();
extern void _ZN7S1385C33v17Ev();
static  VTBL_ENTRY vtc_S1385C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1385C3[0]),
  (VTBL_ENTRY)&_ZN7S1385C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1385C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v17Ev,
};
extern VTBL_ENTRY _ZTI7S1385C3[];
extern  VTBL_ENTRY _ZTV7S1385C3[];
Class_Descriptor cd_S1385C3 = {  "S1385C3", // class name
  bases_S1385C3, 1,
  &(vtc_S1385C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1385C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1385C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1385C2  : S1385C3 {
  char s1385c2f0;
  virtual void  v18(); // _ZN7S1385C23v18Ev
  virtual void  v19(); // _ZN7S1385C23v19Ev
  virtual void  v20(); // _ZN7S1385C23v20Ev
  virtual void  v21(); // _ZN7S1385C23v21Ev
  ~S1385C2(); // tgen
  S1385C2(); // tgen
};
//SIG(-1 S1385C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S1385C2 ::v18(){vfunc_called(this, "_ZN7S1385C23v18Ev");}
void  S1385C2 ::v19(){vfunc_called(this, "_ZN7S1385C23v19Ev");}
void  S1385C2 ::v20(){vfunc_called(this, "_ZN7S1385C23v20Ev");}
void  S1385C2 ::v21(){vfunc_called(this, "_ZN7S1385C23v21Ev");}
S1385C2 ::~S1385C2(){ note_dtor("S1385C2", this);} // tgen
S1385C2 ::S1385C2(){ note_ctor("S1385C2", this);} // tgen

static void Test_S1385C2()
{
  extern Class_Descriptor cd_S1385C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1385C2, buf);
    S1385C2 *dp, &lv = *(dp=new (buf) S1385C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1385C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1385C2)");
    check_base_class_offset(lv, (S1385C4*)(S1385C3*), 0, "S1385C2");
    check_base_class_offset(lv, (S1385C3*), 0, "S1385C2");
    check_field_offset(lv, s1385c2f0, ABISELECT(184,120), "S1385C2.s1385c2f0");
    test_class_info(&lv, &cd_S1385C2);
    dp->~S1385C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1385C2(Test_S1385C2, "S1385C2", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1385C2C1Ev();
extern void _ZN7S1385C2D1Ev();
Name_Map name_map_S1385C2[] = {
  NSPAIR(_ZN7S1385C2C1Ev),
  NSPAIR(_ZN7S1385C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1385C4;
extern VTBL_ENTRY _ZTI7S1385C4[];
extern  VTBL_ENTRY _ZTV7S1385C4[];
extern Class_Descriptor cd_S1385C3;
extern VTBL_ENTRY _ZTI7S1385C3[];
extern  VTBL_ENTRY _ZTV7S1385C3[];
static Base_Class bases_S1385C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1385C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1385C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1385C2[];
extern void _ZN7S1385C2D1Ev();
extern void _ZN7S1385C2D0Ev();
extern void _ZN7S1385C42v3Ev();
extern void _ZN7S1385C42v4Ev();
extern void _ZN7S1385C42v5Ev();
extern void _ZN7S1385C42v6Ev();
extern void _ZN7S1385C42v7Ev();
extern void _ZN7S1385C42v8Ev();
extern void _ZN7S1385C42v9Ev();
extern void _ZN7S1385C43v10Ev();
extern void _ZN7S1385C43v11Ev();
extern void _ZN7S1385C43v12Ev();
extern void _ZN7S1385C33v13Ev();
extern void _ZN7S1385C33v14Ev();
extern void _ZN7S1385C33v15Ev();
extern void _ZN7S1385C33v16Ev();
extern void _ZN7S1385C33v17Ev();
extern void _ZN7S1385C23v18Ev();
extern void _ZN7S1385C23v19Ev();
extern void _ZN7S1385C23v20Ev();
extern void _ZN7S1385C23v21Ev();
static  VTBL_ENTRY vtc_S1385C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1385C2[0]),
  (VTBL_ENTRY)&_ZN7S1385C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1385C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v18Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v21Ev,
};
extern VTBL_ENTRY _ZTI7S1385C2[];
extern  VTBL_ENTRY _ZTV7S1385C2[];
Class_Descriptor cd_S1385C2 = {  "S1385C2", // class name
  bases_S1385C2, 2,
  &(vtc_S1385C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1385C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1385C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1385C1  : S1385C2 {
  virtual void  v1(); // _ZN7S1385C12v1Ev
  virtual void  v2(); // _ZN7S1385C12v2Ev
  ~S1385C1(); // tgen
  S1385C1(); // tgen
};
//SIG(1 S1385C1) C1{ BC2{ BC3{ BC4{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v18 v19 v20 v21 Fc} v1 v2}


void  S1385C1 ::v1(){vfunc_called(this, "_ZN7S1385C12v1Ev");}
void  S1385C1 ::v2(){vfunc_called(this, "_ZN7S1385C12v2Ev");}
S1385C1 ::~S1385C1(){ note_dtor("S1385C1", this);} // tgen
S1385C1 ::S1385C1(){ note_ctor("S1385C1", this);} // tgen

static void Test_S1385C1()
{
  extern Class_Descriptor cd_S1385C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1385C1, buf);
    S1385C1 *dp, &lv = *(dp=new (buf) S1385C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1385C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1385C1)");
    check_base_class_offset(lv, (S1385C4*)(S1385C3*)(S1385C2*), 0, "S1385C1");
    check_base_class_offset(lv, (S1385C3*)(S1385C2*), 0, "S1385C1");
    check_base_class_offset(lv, (S1385C2*), 0, "S1385C1");
    test_class_info(&lv, &cd_S1385C1);
    dp->~S1385C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1385C1(Test_S1385C1, "S1385C1", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1385C1C1Ev();
extern void _ZN7S1385C1D1Ev();
Name_Map name_map_S1385C1[] = {
  NSPAIR(_ZN7S1385C1C1Ev),
  NSPAIR(_ZN7S1385C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1385C4;
extern VTBL_ENTRY _ZTI7S1385C4[];
extern  VTBL_ENTRY _ZTV7S1385C4[];
extern Class_Descriptor cd_S1385C3;
extern VTBL_ENTRY _ZTI7S1385C3[];
extern  VTBL_ENTRY _ZTV7S1385C3[];
extern Class_Descriptor cd_S1385C2;
extern VTBL_ENTRY _ZTI7S1385C2[];
extern  VTBL_ENTRY _ZTV7S1385C2[];
static Base_Class bases_S1385C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1385C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1385C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1385C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1385C1[];
extern void _ZN7S1385C1D1Ev();
extern void _ZN7S1385C1D0Ev();
extern void _ZN7S1385C42v3Ev();
extern void _ZN7S1385C42v4Ev();
extern void _ZN7S1385C42v5Ev();
extern void _ZN7S1385C42v6Ev();
extern void _ZN7S1385C42v7Ev();
extern void _ZN7S1385C42v8Ev();
extern void _ZN7S1385C42v9Ev();
extern void _ZN7S1385C43v10Ev();
extern void _ZN7S1385C43v11Ev();
extern void _ZN7S1385C43v12Ev();
extern void _ZN7S1385C33v13Ev();
extern void _ZN7S1385C33v14Ev();
extern void _ZN7S1385C33v15Ev();
extern void _ZN7S1385C33v16Ev();
extern void _ZN7S1385C33v17Ev();
extern void _ZN7S1385C23v18Ev();
extern void _ZN7S1385C23v19Ev();
extern void _ZN7S1385C23v20Ev();
extern void _ZN7S1385C23v21Ev();
extern void _ZN7S1385C12v1Ev();
extern void _ZN7S1385C12v2Ev();
static  VTBL_ENTRY vtc_S1385C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1385C1[0]),
  (VTBL_ENTRY)&_ZN7S1385C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1385C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1385C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1385C43v12Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1385C33v17Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v18Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1385C23v21Ev,
  (VTBL_ENTRY)&_ZN7S1385C12v1Ev,
  (VTBL_ENTRY)&_ZN7S1385C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S1385C1[];
extern  VTBL_ENTRY _ZTV7S1385C1[];
Class_Descriptor cd_S1385C1 = {  "S1385C1", // class name
  bases_S1385C1, 3,
  &(vtc_S1385C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1385C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1385C1),25, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1343C4  {
  void *s1343c4f0[2];
  ::S10103C13_nt s1343c4f1;
  void *s1343c4f2;
  virtual  ~S1343C4(); // _ZN7S1343C4D1Ev
  virtual void  v2(); // _ZN7S1343C42v2Ev
  virtual void  v3(); // _ZN7S1343C42v3Ev
  virtual void  v4(); // _ZN7S1343C42v4Ev
  virtual void  v5(); // _ZN7S1343C42v5Ev
  virtual void  v6(); // _ZN7S1343C42v6Ev
  virtual void  v7(); // _ZN7S1343C42v7Ev
  virtual void  v8(); // _ZN7S1343C42v8Ev
  virtual void  v9(); // _ZN7S1343C42v9Ev
  virtual void  v10(); // _ZN7S1343C43v10Ev
  virtual void  v11(); // _ZN7S1343C43v11Ev
  S1343C4(); // tgen
};
//SIG(-1 S1343C4) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S1343C4 ::~S1343C4(){ note_dtor("S1343C4", this);}
void  S1343C4 ::v2(){vfunc_called(this, "_ZN7S1343C42v2Ev");}
void  S1343C4 ::v3(){vfunc_called(this, "_ZN7S1343C42v3Ev");}
void  S1343C4 ::v4(){vfunc_called(this, "_ZN7S1343C42v4Ev");}
void  S1343C4 ::v5(){vfunc_called(this, "_ZN7S1343C42v5Ev");}
void  S1343C4 ::v6(){vfunc_called(this, "_ZN7S1343C42v6Ev");}
void  S1343C4 ::v7(){vfunc_called(this, "_ZN7S1343C42v7Ev");}
void  S1343C4 ::v8(){vfunc_called(this, "_ZN7S1343C42v8Ev");}
void  S1343C4 ::v9(){vfunc_called(this, "_ZN7S1343C42v9Ev");}
void  S1343C4 ::v10(){vfunc_called(this, "_ZN7S1343C43v10Ev");}
void  S1343C4 ::v11(){vfunc_called(this, "_ZN7S1343C43v11Ev");}
S1343C4 ::S1343C4(){ note_ctor("S1343C4", this);} // tgen

static void Test_S1343C4()
{
  extern Class_Descriptor cd_S1343C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S1343C4, buf);
    S1343C4 *dp, &lv = *(dp=new (buf) S1343C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S1343C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1343C4)");
    check_field_offset(lv, s1343c4f0, ABISELECT(8,4), "S1343C4.s1343c4f0");
    check_field_offset(lv, s1343c4f1, ABISELECT(24,12), "S1343C4.s1343c4f1");
    check_field_offset(lv, s1343c4f2, ABISELECT(48,28), "S1343C4.s1343c4f2");
    test_class_info(&lv, &cd_S1343C4);
    dp->~S1343C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1343C4(Test_S1343C4, "S1343C4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S1343C4C1Ev();
extern void _ZN7S1343C4D1Ev();
Name_Map name_map_S1343C4[] = {
  NSPAIR(_ZN7S1343C4C1Ev),
  NSPAIR(_ZN7S1343C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S1343C4[];
extern void _ZN7S1343C4D1Ev();
extern void _ZN7S1343C4D0Ev();
extern void _ZN7S1343C42v2Ev();
extern void _ZN7S1343C42v3Ev();
extern void _ZN7S1343C42v4Ev();
extern void _ZN7S1343C42v5Ev();
extern void _ZN7S1343C42v6Ev();
extern void _ZN7S1343C42v7Ev();
extern void _ZN7S1343C42v8Ev();
extern void _ZN7S1343C42v9Ev();
extern void _ZN7S1343C43v10Ev();
extern void _ZN7S1343C43v11Ev();
static  VTBL_ENTRY vtc_S1343C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1343C4[0]),
  (VTBL_ENTRY)&_ZN7S1343C4D1Ev,
  (VTBL_ENTRY)&_ZN7S1343C4D0Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v11Ev,
};
extern VTBL_ENTRY _ZTI7S1343C4[];
extern  VTBL_ENTRY _ZTV7S1343C4[];
Class_Descriptor cd_S1343C4 = {  "S1343C4", // class name
  0,0,//no base classes
  &(vtc_S1343C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S1343C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S1343C4),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1343C3  : S1343C4 {
  void *s1343c3f0;
  ::S10103C13_nt s1343c3f1;
  ::S10103C13_nt s1343c3f2;
  ::S10103C13_nt s1343c3f3;
  ::S10103C86 s1343c3f4;
  ::S10103C86 s1343c3f5;
  ::S10103C86 s1343c3f6;
  virtual  ~S1343C3(); // _ZN7S1343C3D1Ev
  virtual void  v12(); // _ZN7S1343C33v12Ev
  virtual void  v13(); // _ZN7S1343C33v13Ev
  virtual void  v14(); // _ZN7S1343C33v14Ev
  virtual void  v15(); // _ZN7S1343C33v15Ev
  virtual void  v16(); // _ZN7S1343C33v16Ev
  S1343C3(); // tgen
};
//SIG(-1 S1343C3) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S1343C3 ::~S1343C3(){ note_dtor("S1343C3", this);}
void  S1343C3 ::v12(){vfunc_called(this, "_ZN7S1343C33v12Ev");}
void  S1343C3 ::v13(){vfunc_called(this, "_ZN7S1343C33v13Ev");}
void  S1343C3 ::v14(){vfunc_called(this, "_ZN7S1343C33v14Ev");}
void  S1343C3 ::v15(){vfunc_called(this, "_ZN7S1343C33v15Ev");}
void  S1343C3 ::v16(){vfunc_called(this, "_ZN7S1343C33v16Ev");}
S1343C3 ::S1343C3(){ note_ctor("S1343C3", this);} // tgen

static void Test_S1343C3()
{
  extern Class_Descriptor cd_S1343C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S1343C3, buf);
    S1343C3 *dp, &lv = *(dp=new (buf) S1343C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S1343C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1343C3)");
    check_base_class_offset(lv, (S1343C4*), 0, "S1343C3");
    check_field_offset(lv, s1343c3f0, ABISELECT(56,32), "S1343C3.s1343c3f0");
    check_field_offset(lv, s1343c3f1, ABISELECT(64,36), "S1343C3.s1343c3f1");
    check_field_offset(lv, s1343c3f2, ABISELECT(88,52), "S1343C3.s1343c3f2");
    check_field_offset(lv, s1343c3f3, ABISELECT(112,68), "S1343C3.s1343c3f3");
    check_field_offset(lv, s1343c3f4, ABISELECT(136,84), "S1343C3.s1343c3f4");
    check_field_offset(lv, s1343c3f5, ABISELECT(152,96), "S1343C3.s1343c3f5");
    check_field_offset(lv, s1343c3f6, ABISELECT(168,108), "S1343C3.s1343c3f6");
    test_class_info(&lv, &cd_S1343C3);
    dp->~S1343C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1343C3(Test_S1343C3, "S1343C3", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S1343C3C1Ev();
extern void _ZN7S1343C3D1Ev();
Name_Map name_map_S1343C3[] = {
  NSPAIR(_ZN7S1343C3C1Ev),
  NSPAIR(_ZN7S1343C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1343C4;
extern VTBL_ENTRY _ZTI7S1343C4[];
extern  VTBL_ENTRY _ZTV7S1343C4[];
static Base_Class bases_S1343C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1343C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1343C3[];
extern void _ZN7S1343C3D1Ev();
extern void _ZN7S1343C3D0Ev();
extern void _ZN7S1343C42v2Ev();
extern void _ZN7S1343C42v3Ev();
extern void _ZN7S1343C42v4Ev();
extern void _ZN7S1343C42v5Ev();
extern void _ZN7S1343C42v6Ev();
extern void _ZN7S1343C42v7Ev();
extern void _ZN7S1343C42v8Ev();
extern void _ZN7S1343C42v9Ev();
extern void _ZN7S1343C43v10Ev();
extern void _ZN7S1343C43v11Ev();
extern void _ZN7S1343C33v12Ev();
extern void _ZN7S1343C33v13Ev();
extern void _ZN7S1343C33v14Ev();
extern void _ZN7S1343C33v15Ev();
extern void _ZN7S1343C33v16Ev();
static  VTBL_ENTRY vtc_S1343C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1343C3[0]),
  (VTBL_ENTRY)&_ZN7S1343C3D1Ev,
  (VTBL_ENTRY)&_ZN7S1343C3D0Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v16Ev,
};
extern VTBL_ENTRY _ZTI7S1343C3[];
extern  VTBL_ENTRY _ZTV7S1343C3[];
Class_Descriptor cd_S1343C3 = {  "S1343C3", // class name
  bases_S1343C3, 1,
  &(vtc_S1343C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S1343C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1343C3),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1343C2  : S1343C3 {
  char s1343c2f0;
  virtual void  v17(); // _ZN7S1343C23v17Ev
  virtual void  v18(); // _ZN7S1343C23v18Ev
  virtual void  v19(); // _ZN7S1343C23v19Ev
  virtual void  v20(); // _ZN7S1343C23v20Ev
  ~S1343C2(); // tgen
  S1343C2(); // tgen
};
//SIG(-1 S1343C2) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 Fc}


void  S1343C2 ::v17(){vfunc_called(this, "_ZN7S1343C23v17Ev");}
void  S1343C2 ::v18(){vfunc_called(this, "_ZN7S1343C23v18Ev");}
void  S1343C2 ::v19(){vfunc_called(this, "_ZN7S1343C23v19Ev");}
void  S1343C2 ::v20(){vfunc_called(this, "_ZN7S1343C23v20Ev");}
S1343C2 ::~S1343C2(){ note_dtor("S1343C2", this);} // tgen
S1343C2 ::S1343C2(){ note_ctor("S1343C2", this);} // tgen

static void Test_S1343C2()
{
  extern Class_Descriptor cd_S1343C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1343C2, buf);
    S1343C2 *dp, &lv = *(dp=new (buf) S1343C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1343C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1343C2)");
    check_base_class_offset(lv, (S1343C4*)(S1343C3*), 0, "S1343C2");
    check_base_class_offset(lv, (S1343C3*), 0, "S1343C2");
    check_field_offset(lv, s1343c2f0, ABISELECT(184,120), "S1343C2.s1343c2f0");
    test_class_info(&lv, &cd_S1343C2);
    dp->~S1343C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1343C2(Test_S1343C2, "S1343C2", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1343C2C1Ev();
extern void _ZN7S1343C2D1Ev();
Name_Map name_map_S1343C2[] = {
  NSPAIR(_ZN7S1343C2C1Ev),
  NSPAIR(_ZN7S1343C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1343C4;
extern VTBL_ENTRY _ZTI7S1343C4[];
extern  VTBL_ENTRY _ZTV7S1343C4[];
extern Class_Descriptor cd_S1343C3;
extern VTBL_ENTRY _ZTI7S1343C3[];
extern  VTBL_ENTRY _ZTV7S1343C3[];
static Base_Class bases_S1343C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1343C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1343C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1343C2[];
extern void _ZN7S1343C2D1Ev();
extern void _ZN7S1343C2D0Ev();
extern void _ZN7S1343C42v2Ev();
extern void _ZN7S1343C42v3Ev();
extern void _ZN7S1343C42v4Ev();
extern void _ZN7S1343C42v5Ev();
extern void _ZN7S1343C42v6Ev();
extern void _ZN7S1343C42v7Ev();
extern void _ZN7S1343C42v8Ev();
extern void _ZN7S1343C42v9Ev();
extern void _ZN7S1343C43v10Ev();
extern void _ZN7S1343C43v11Ev();
extern void _ZN7S1343C33v12Ev();
extern void _ZN7S1343C33v13Ev();
extern void _ZN7S1343C33v14Ev();
extern void _ZN7S1343C33v15Ev();
extern void _ZN7S1343C33v16Ev();
extern void _ZN7S1343C23v17Ev();
extern void _ZN7S1343C23v18Ev();
extern void _ZN7S1343C23v19Ev();
extern void _ZN7S1343C23v20Ev();
static  VTBL_ENTRY vtc_S1343C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1343C2[0]),
  (VTBL_ENTRY)&_ZN7S1343C2D1Ev,
  (VTBL_ENTRY)&_ZN7S1343C2D0Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v17Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v18Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v20Ev,
};
extern VTBL_ENTRY _ZTI7S1343C2[];
extern  VTBL_ENTRY _ZTV7S1343C2[];
Class_Descriptor cd_S1343C2 = {  "S1343C2", // class name
  bases_S1343C2, 2,
  &(vtc_S1343C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1343C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1343C2),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1343C1  : S1343C2 {
  virtual void  v1(); // _ZN7S1343C12v1Ev
  ~S1343C1(); // tgen
  S1343C1(); // tgen
};
//SIG(1 S1343C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC5{ m FC6{ m Fp Fi FC7{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 Fp FC5 FC5 FC5 FC8{ m Fp Fi FC9{ m} FC10{ m}} FC8 FC8} v17 v18 v19 v20 Fc} v1}


void  S1343C1 ::v1(){vfunc_called(this, "_ZN7S1343C12v1Ev");}
S1343C1 ::~S1343C1(){ note_dtor("S1343C1", this);} // tgen
S1343C1 ::S1343C1(){ note_ctor("S1343C1", this);} // tgen

static void Test_S1343C1()
{
  extern Class_Descriptor cd_S1343C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,32)];
    init_test(&cd_S1343C1, buf);
    S1343C1 *dp, &lv = *(dp=new (buf) S1343C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,124), "sizeof(S1343C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1343C1)");
    check_base_class_offset(lv, (S1343C4*)(S1343C3*)(S1343C2*), 0, "S1343C1");
    check_base_class_offset(lv, (S1343C3*)(S1343C2*), 0, "S1343C1");
    check_base_class_offset(lv, (S1343C2*), 0, "S1343C1");
    test_class_info(&lv, &cd_S1343C1);
    dp->~S1343C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1343C1(Test_S1343C1, "S1343C1", ABISELECT(192,124));

#else // __cplusplus

extern void _ZN7S1343C1C1Ev();
extern void _ZN7S1343C1D1Ev();
Name_Map name_map_S1343C1[] = {
  NSPAIR(_ZN7S1343C1C1Ev),
  NSPAIR(_ZN7S1343C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S1343C4;
extern VTBL_ENTRY _ZTI7S1343C4[];
extern  VTBL_ENTRY _ZTV7S1343C4[];
extern Class_Descriptor cd_S1343C3;
extern VTBL_ENTRY _ZTI7S1343C3[];
extern  VTBL_ENTRY _ZTV7S1343C3[];
extern Class_Descriptor cd_S1343C2;
extern VTBL_ENTRY _ZTI7S1343C2[];
extern  VTBL_ENTRY _ZTV7S1343C2[];
static Base_Class bases_S1343C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1343C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1343C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1343C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S1343C1[];
extern void _ZN7S1343C1D1Ev();
extern void _ZN7S1343C1D0Ev();
extern void _ZN7S1343C42v2Ev();
extern void _ZN7S1343C42v3Ev();
extern void _ZN7S1343C42v4Ev();
extern void _ZN7S1343C42v5Ev();
extern void _ZN7S1343C42v6Ev();
extern void _ZN7S1343C42v7Ev();
extern void _ZN7S1343C42v8Ev();
extern void _ZN7S1343C42v9Ev();
extern void _ZN7S1343C43v10Ev();
extern void _ZN7S1343C43v11Ev();
extern void _ZN7S1343C33v12Ev();
extern void _ZN7S1343C33v13Ev();
extern void _ZN7S1343C33v14Ev();
extern void _ZN7S1343C33v15Ev();
extern void _ZN7S1343C33v16Ev();
extern void _ZN7S1343C23v17Ev();
extern void _ZN7S1343C23v18Ev();
extern void _ZN7S1343C23v19Ev();
extern void _ZN7S1343C23v20Ev();
extern void _ZN7S1343C12v1Ev();
static  VTBL_ENTRY vtc_S1343C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S1343C1[0]),
  (VTBL_ENTRY)&_ZN7S1343C1D1Ev,
  (VTBL_ENTRY)&_ZN7S1343C1D0Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v2Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v3Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v4Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v5Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v6Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v7Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v8Ev,
  (VTBL_ENTRY)&_ZN7S1343C42v9Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v10Ev,
  (VTBL_ENTRY)&_ZN7S1343C43v11Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v12Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v13Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v14Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v15Ev,
  (VTBL_ENTRY)&_ZN7S1343C33v16Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v17Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v18Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v19Ev,
  (VTBL_ENTRY)&_ZN7S1343C23v20Ev,
  (VTBL_ENTRY)&_ZN7S1343C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S1343C1[];
extern  VTBL_ENTRY _ZTV7S1343C1[];
Class_Descriptor cd_S1343C1 = {  "S1343C1", // class name
  bases_S1343C1, 3,
  &(vtc_S1343C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,124), // object size
  NSPAIRA(_ZTI7S1343C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S1343C1),24, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3316C3  {
  void *s3316c3f0[2];
  ::S10103C13_nt s3316c3f1;
  void *s3316c3f2;
  virtual  ~S3316C3(); // _ZN7S3316C3D1Ev
  virtual void  v5(); // _ZN7S3316C32v5Ev
  virtual void  v6(); // _ZN7S3316C32v6Ev
  virtual void  v7(); // _ZN7S3316C32v7Ev
  virtual void  v8(); // _ZN7S3316C32v8Ev
  virtual void  v9(); // _ZN7S3316C32v9Ev
  virtual void  v10(); // _ZN7S3316C33v10Ev
  virtual void  v11(); // _ZN7S3316C33v11Ev
  virtual void  v12(); // _ZN7S3316C33v12Ev
  virtual void  v13(); // _ZN7S3316C33v13Ev
  virtual void  v14(); // _ZN7S3316C33v14Ev
  S3316C3(); // tgen
};
//SIG(-1 S3316C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3316C3 ::~S3316C3(){ note_dtor("S3316C3", this);}
void  S3316C3 ::v5(){vfunc_called(this, "_ZN7S3316C32v5Ev");}
void  S3316C3 ::v6(){vfunc_called(this, "_ZN7S3316C32v6Ev");}
void  S3316C3 ::v7(){vfunc_called(this, "_ZN7S3316C32v7Ev");}
void  S3316C3 ::v8(){vfunc_called(this, "_ZN7S3316C32v8Ev");}
void  S3316C3 ::v9(){vfunc_called(this, "_ZN7S3316C32v9Ev");}
void  S3316C3 ::v10(){vfunc_called(this, "_ZN7S3316C33v10Ev");}
void  S3316C3 ::v11(){vfunc_called(this, "_ZN7S3316C33v11Ev");}
void  S3316C3 ::v12(){vfunc_called(this, "_ZN7S3316C33v12Ev");}
void  S3316C3 ::v13(){vfunc_called(this, "_ZN7S3316C33v13Ev");}
void  S3316C3 ::v14(){vfunc_called(this, "_ZN7S3316C33v14Ev");}
S3316C3 ::S3316C3(){ note_ctor("S3316C3", this);} // tgen

static void Test_S3316C3()
{
  extern Class_Descriptor cd_S3316C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3316C3, buf);
    S3316C3 *dp, &lv = *(dp=new (buf) S3316C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3316C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3316C3)");
    check_field_offset(lv, s3316c3f0, ABISELECT(8,4), "S3316C3.s3316c3f0");
    check_field_offset(lv, s3316c3f1, ABISELECT(24,12), "S3316C3.s3316c3f1");
    check_field_offset(lv, s3316c3f2, ABISELECT(48,28), "S3316C3.s3316c3f2");
    test_class_info(&lv, &cd_S3316C3);
    dp->~S3316C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3316C3(Test_S3316C3, "S3316C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3316C3C1Ev();
extern void _ZN7S3316C3D1Ev();
Name_Map name_map_S3316C3[] = {
  NSPAIR(_ZN7S3316C3C1Ev),
  NSPAIR(_ZN7S3316C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3316C3[];
extern void _ZN7S3316C3D1Ev();
extern void _ZN7S3316C3D0Ev();
extern void _ZN7S3316C32v5Ev();
extern void _ZN7S3316C32v6Ev();
extern void _ZN7S3316C32v7Ev();
extern void _ZN7S3316C32v8Ev();
extern void _ZN7S3316C32v9Ev();
extern void _ZN7S3316C33v10Ev();
extern void _ZN7S3316C33v11Ev();
extern void _ZN7S3316C33v12Ev();
extern void _ZN7S3316C33v13Ev();
extern void _ZN7S3316C33v14Ev();
static  VTBL_ENTRY vtc_S3316C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3316C3[0]),
  (VTBL_ENTRY)&_ZN7S3316C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3316C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3316C3[];
extern  VTBL_ENTRY _ZTV7S3316C3[];
Class_Descriptor cd_S3316C3 = {  "S3316C3", // class name
  0,0,//no base classes
  &(vtc_S3316C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3316C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3316C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3316C2  : S3316C3 {
  void *s3316c2f0;
  ::S10103C13_nt s3316c2f1;
  ::S10103C13_nt s3316c2f2;
  ::S10103C13_nt s3316c2f3;
  ::S10103C86 s3316c2f4;
  ::S10103C86 s3316c2f5;
  ::S10103C86 s3316c2f6;
  virtual  ~S3316C2(); // _ZN7S3316C2D1Ev
  virtual void  v15(); // _ZN7S3316C23v15Ev
  virtual void  v16(); // _ZN7S3316C23v16Ev
  virtual void  v17(); // _ZN7S3316C23v17Ev
  virtual void  v18(); // _ZN7S3316C23v18Ev
  virtual void  v19(); // _ZN7S3316C23v19Ev
  S3316C2(); // tgen
};
//SIG(-1 S3316C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3316C2 ::~S3316C2(){ note_dtor("S3316C2", this);}
void  S3316C2 ::v15(){vfunc_called(this, "_ZN7S3316C23v15Ev");}
void  S3316C2 ::v16(){vfunc_called(this, "_ZN7S3316C23v16Ev");}
void  S3316C2 ::v17(){vfunc_called(this, "_ZN7S3316C23v17Ev");}
void  S3316C2 ::v18(){vfunc_called(this, "_ZN7S3316C23v18Ev");}
void  S3316C2 ::v19(){vfunc_called(this, "_ZN7S3316C23v19Ev");}
S3316C2 ::S3316C2(){ note_ctor("S3316C2", this);} // tgen

static void Test_S3316C2()
{
  extern Class_Descriptor cd_S3316C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3316C2, buf);
    S3316C2 *dp, &lv = *(dp=new (buf) S3316C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3316C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3316C2)");
    check_base_class_offset(lv, (S3316C3*), 0, "S3316C2");
    check_field_offset(lv, s3316c2f0, ABISELECT(56,32), "S3316C2.s3316c2f0");
    check_field_offset(lv, s3316c2f1, ABISELECT(64,36), "S3316C2.s3316c2f1");
    check_field_offset(lv, s3316c2f2, ABISELECT(88,52), "S3316C2.s3316c2f2");
    check_field_offset(lv, s3316c2f3, ABISELECT(112,68), "S3316C2.s3316c2f3");
    check_field_offset(lv, s3316c2f4, ABISELECT(136,84), "S3316C2.s3316c2f4");
    check_field_offset(lv, s3316c2f5, ABISELECT(152,96), "S3316C2.s3316c2f5");
    check_field_offset(lv, s3316c2f6, ABISELECT(168,108), "S3316C2.s3316c2f6");
    test_class_info(&lv, &cd_S3316C2);
    dp->~S3316C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3316C2(Test_S3316C2, "S3316C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3316C2C1Ev();
extern void _ZN7S3316C2D1Ev();
Name_Map name_map_S3316C2[] = {
  NSPAIR(_ZN7S3316C2C1Ev),
  NSPAIR(_ZN7S3316C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3316C3;
extern VTBL_ENTRY _ZTI7S3316C3[];
extern  VTBL_ENTRY _ZTV7S3316C3[];
static Base_Class bases_S3316C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3316C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3316C2[];
extern void _ZN7S3316C2D1Ev();
extern void _ZN7S3316C2D0Ev();
extern void _ZN7S3316C32v5Ev();
extern void _ZN7S3316C32v6Ev();
extern void _ZN7S3316C32v7Ev();
extern void _ZN7S3316C32v8Ev();
extern void _ZN7S3316C32v9Ev();
extern void _ZN7S3316C33v10Ev();
extern void _ZN7S3316C33v11Ev();
extern void _ZN7S3316C33v12Ev();
extern void _ZN7S3316C33v13Ev();
extern void _ZN7S3316C33v14Ev();
extern void _ZN7S3316C23v15Ev();
extern void _ZN7S3316C23v16Ev();
extern void _ZN7S3316C23v17Ev();
extern void _ZN7S3316C23v18Ev();
extern void _ZN7S3316C23v19Ev();
static  VTBL_ENTRY vtc_S3316C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3316C2[0]),
  (VTBL_ENTRY)&_ZN7S3316C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3316C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3316C2[];
extern  VTBL_ENTRY _ZTV7S3316C2[];
Class_Descriptor cd_S3316C2 = {  "S3316C2", // class name
  bases_S3316C2, 1,
  &(vtc_S3316C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3316C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3316C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3316C1  : S3316C2 {
  int s3316c1f0[2];
  virtual  ~S3316C1(); // _ZN7S3316C1D1Ev
  virtual void  v1(); // _ZN7S3316C12v1Ev
  virtual void  v2(); // _ZN7S3316C12v2Ev
  virtual void  v3(); // _ZN7S3316C12v3Ev
  virtual void  v4(); // _ZN7S3316C12v4Ev
  S3316C1(); // tgen
};
//SIG(1 S3316C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 Fi[2]}


 S3316C1 ::~S3316C1(){ note_dtor("S3316C1", this);}
void  S3316C1 ::v1(){vfunc_called(this, "_ZN7S3316C12v1Ev");}
void  S3316C1 ::v2(){vfunc_called(this, "_ZN7S3316C12v2Ev");}
void  S3316C1 ::v3(){vfunc_called(this, "_ZN7S3316C12v3Ev");}
void  S3316C1 ::v4(){vfunc_called(this, "_ZN7S3316C12v4Ev");}
S3316C1 ::S3316C1(){ note_ctor("S3316C1", this);} // tgen

static void Test_S3316C1()
{
  extern Class_Descriptor cd_S3316C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S3316C1, buf);
    S3316C1 *dp, &lv = *(dp=new (buf) S3316C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S3316C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3316C1)");
    check_base_class_offset(lv, (S3316C3*)(S3316C2*), 0, "S3316C1");
    check_base_class_offset(lv, (S3316C2*), 0, "S3316C1");
    check_field_offset(lv, s3316c1f0, ABISELECT(184,120), "S3316C1.s3316c1f0");
    test_class_info(&lv, &cd_S3316C1);
    dp->~S3316C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3316C1(Test_S3316C1, "S3316C1", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN7S3316C1C1Ev();
extern void _ZN7S3316C1D1Ev();
Name_Map name_map_S3316C1[] = {
  NSPAIR(_ZN7S3316C1C1Ev),
  NSPAIR(_ZN7S3316C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3316C3;
extern VTBL_ENTRY _ZTI7S3316C3[];
extern  VTBL_ENTRY _ZTV7S3316C3[];
extern Class_Descriptor cd_S3316C2;
extern VTBL_ENTRY _ZTI7S3316C2[];
extern  VTBL_ENTRY _ZTV7S3316C2[];
static Base_Class bases_S3316C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3316C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3316C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3316C1[];
extern void _ZN7S3316C1D1Ev();
extern void _ZN7S3316C1D0Ev();
extern void _ZN7S3316C32v5Ev();
extern void _ZN7S3316C32v6Ev();
extern void _ZN7S3316C32v7Ev();
extern void _ZN7S3316C32v8Ev();
extern void _ZN7S3316C32v9Ev();
extern void _ZN7S3316C33v10Ev();
extern void _ZN7S3316C33v11Ev();
extern void _ZN7S3316C33v12Ev();
extern void _ZN7S3316C33v13Ev();
extern void _ZN7S3316C33v14Ev();
extern void _ZN7S3316C23v15Ev();
extern void _ZN7S3316C23v16Ev();
extern void _ZN7S3316C23v17Ev();
extern void _ZN7S3316C23v18Ev();
extern void _ZN7S3316C23v19Ev();
extern void _ZN7S3316C12v1Ev();
extern void _ZN7S3316C12v2Ev();
extern void _ZN7S3316C12v3Ev();
extern void _ZN7S3316C12v4Ev();
static  VTBL_ENTRY vtc_S3316C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3316C1[0]),
  (VTBL_ENTRY)&_ZN7S3316C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3316C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3316C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3316C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3316C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3316C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3316C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3316C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3316C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3316C1[];
extern  VTBL_ENTRY _ZTV7S3316C1[];
Class_Descriptor cd_S3316C1 = {  "S3316C1", // class name
  bases_S3316C1, 2,
  &(vtc_S3316C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI7S3316C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3316C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3313C3  {
  void *s3313c3f0[2];
  ::S10103C13_nt s3313c3f1;
  void *s3313c3f2;
  virtual  ~S3313C3(); // _ZN7S3313C3D1Ev
  virtual void  v5(); // _ZN7S3313C32v5Ev
  virtual void  v6(); // _ZN7S3313C32v6Ev
  virtual void  v7(); // _ZN7S3313C32v7Ev
  virtual void  v8(); // _ZN7S3313C32v8Ev
  virtual void  v9(); // _ZN7S3313C32v9Ev
  virtual void  v10(); // _ZN7S3313C33v10Ev
  virtual void  v11(); // _ZN7S3313C33v11Ev
  virtual void  v12(); // _ZN7S3313C33v12Ev
  virtual void  v13(); // _ZN7S3313C33v13Ev
  virtual void  v14(); // _ZN7S3313C33v14Ev
  S3313C3(); // tgen
};
//SIG(-1 S3313C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3313C3 ::~S3313C3(){ note_dtor("S3313C3", this);}
void  S3313C3 ::v5(){vfunc_called(this, "_ZN7S3313C32v5Ev");}
void  S3313C3 ::v6(){vfunc_called(this, "_ZN7S3313C32v6Ev");}
void  S3313C3 ::v7(){vfunc_called(this, "_ZN7S3313C32v7Ev");}
void  S3313C3 ::v8(){vfunc_called(this, "_ZN7S3313C32v8Ev");}
void  S3313C3 ::v9(){vfunc_called(this, "_ZN7S3313C32v9Ev");}
void  S3313C3 ::v10(){vfunc_called(this, "_ZN7S3313C33v10Ev");}
void  S3313C3 ::v11(){vfunc_called(this, "_ZN7S3313C33v11Ev");}
void  S3313C3 ::v12(){vfunc_called(this, "_ZN7S3313C33v12Ev");}
void  S3313C3 ::v13(){vfunc_called(this, "_ZN7S3313C33v13Ev");}
void  S3313C3 ::v14(){vfunc_called(this, "_ZN7S3313C33v14Ev");}
S3313C3 ::S3313C3(){ note_ctor("S3313C3", this);} // tgen

static void Test_S3313C3()
{
  extern Class_Descriptor cd_S3313C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3313C3, buf);
    S3313C3 *dp, &lv = *(dp=new (buf) S3313C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3313C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3313C3)");
    check_field_offset(lv, s3313c3f0, ABISELECT(8,4), "S3313C3.s3313c3f0");
    check_field_offset(lv, s3313c3f1, ABISELECT(24,12), "S3313C3.s3313c3f1");
    check_field_offset(lv, s3313c3f2, ABISELECT(48,28), "S3313C3.s3313c3f2");
    test_class_info(&lv, &cd_S3313C3);
    dp->~S3313C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3313C3(Test_S3313C3, "S3313C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3313C3C1Ev();
extern void _ZN7S3313C3D1Ev();
Name_Map name_map_S3313C3[] = {
  NSPAIR(_ZN7S3313C3C1Ev),
  NSPAIR(_ZN7S3313C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3313C3[];
extern void _ZN7S3313C3D1Ev();
extern void _ZN7S3313C3D0Ev();
extern void _ZN7S3313C32v5Ev();
extern void _ZN7S3313C32v6Ev();
extern void _ZN7S3313C32v7Ev();
extern void _ZN7S3313C32v8Ev();
extern void _ZN7S3313C32v9Ev();
extern void _ZN7S3313C33v10Ev();
extern void _ZN7S3313C33v11Ev();
extern void _ZN7S3313C33v12Ev();
extern void _ZN7S3313C33v13Ev();
extern void _ZN7S3313C33v14Ev();
static  VTBL_ENTRY vtc_S3313C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3313C3[0]),
  (VTBL_ENTRY)&_ZN7S3313C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3313C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3313C3[];
extern  VTBL_ENTRY _ZTV7S3313C3[];
Class_Descriptor cd_S3313C3 = {  "S3313C3", // class name
  0,0,//no base classes
  &(vtc_S3313C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3313C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3313C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3313C2  : S3313C3 {
  void *s3313c2f0;
  ::S10103C13_nt s3313c2f1;
  ::S10103C13_nt s3313c2f2;
  ::S10103C13_nt s3313c2f3;
  ::S10103C86 s3313c2f4;
  ::S10103C86 s3313c2f5;
  ::S10103C86 s3313c2f6;
  virtual  ~S3313C2(); // _ZN7S3313C2D1Ev
  virtual void  v15(); // _ZN7S3313C23v15Ev
  virtual void  v16(); // _ZN7S3313C23v16Ev
  virtual void  v17(); // _ZN7S3313C23v17Ev
  virtual void  v18(); // _ZN7S3313C23v18Ev
  virtual void  v19(); // _ZN7S3313C23v19Ev
  S3313C2(); // tgen
};
//SIG(-1 S3313C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3313C2 ::~S3313C2(){ note_dtor("S3313C2", this);}
void  S3313C2 ::v15(){vfunc_called(this, "_ZN7S3313C23v15Ev");}
void  S3313C2 ::v16(){vfunc_called(this, "_ZN7S3313C23v16Ev");}
void  S3313C2 ::v17(){vfunc_called(this, "_ZN7S3313C23v17Ev");}
void  S3313C2 ::v18(){vfunc_called(this, "_ZN7S3313C23v18Ev");}
void  S3313C2 ::v19(){vfunc_called(this, "_ZN7S3313C23v19Ev");}
S3313C2 ::S3313C2(){ note_ctor("S3313C2", this);} // tgen

static void Test_S3313C2()
{
  extern Class_Descriptor cd_S3313C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3313C2, buf);
    S3313C2 *dp, &lv = *(dp=new (buf) S3313C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3313C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3313C2)");
    check_base_class_offset(lv, (S3313C3*), 0, "S3313C2");
    check_field_offset(lv, s3313c2f0, ABISELECT(56,32), "S3313C2.s3313c2f0");
    check_field_offset(lv, s3313c2f1, ABISELECT(64,36), "S3313C2.s3313c2f1");
    check_field_offset(lv, s3313c2f2, ABISELECT(88,52), "S3313C2.s3313c2f2");
    check_field_offset(lv, s3313c2f3, ABISELECT(112,68), "S3313C2.s3313c2f3");
    check_field_offset(lv, s3313c2f4, ABISELECT(136,84), "S3313C2.s3313c2f4");
    check_field_offset(lv, s3313c2f5, ABISELECT(152,96), "S3313C2.s3313c2f5");
    check_field_offset(lv, s3313c2f6, ABISELECT(168,108), "S3313C2.s3313c2f6");
    test_class_info(&lv, &cd_S3313C2);
    dp->~S3313C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3313C2(Test_S3313C2, "S3313C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3313C2C1Ev();
extern void _ZN7S3313C2D1Ev();
Name_Map name_map_S3313C2[] = {
  NSPAIR(_ZN7S3313C2C1Ev),
  NSPAIR(_ZN7S3313C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3313C3;
extern VTBL_ENTRY _ZTI7S3313C3[];
extern  VTBL_ENTRY _ZTV7S3313C3[];
static Base_Class bases_S3313C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3313C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3313C2[];
extern void _ZN7S3313C2D1Ev();
extern void _ZN7S3313C2D0Ev();
extern void _ZN7S3313C32v5Ev();
extern void _ZN7S3313C32v6Ev();
extern void _ZN7S3313C32v7Ev();
extern void _ZN7S3313C32v8Ev();
extern void _ZN7S3313C32v9Ev();
extern void _ZN7S3313C33v10Ev();
extern void _ZN7S3313C33v11Ev();
extern void _ZN7S3313C33v12Ev();
extern void _ZN7S3313C33v13Ev();
extern void _ZN7S3313C33v14Ev();
extern void _ZN7S3313C23v15Ev();
extern void _ZN7S3313C23v16Ev();
extern void _ZN7S3313C23v17Ev();
extern void _ZN7S3313C23v18Ev();
extern void _ZN7S3313C23v19Ev();
static  VTBL_ENTRY vtc_S3313C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3313C2[0]),
  (VTBL_ENTRY)&_ZN7S3313C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3313C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3313C2[];
extern  VTBL_ENTRY _ZTV7S3313C2[];
Class_Descriptor cd_S3313C2 = {  "S3313C2", // class name
  bases_S3313C2, 1,
  &(vtc_S3313C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3313C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3313C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3313C1  : S3313C2 {
  ::S10103C13_nt s3313c1f0;
  virtual  ~S3313C1(); // _ZN7S3313C1D1Ev
  virtual void  v1(); // _ZN7S3313C12v1Ev
  virtual void  v2(); // _ZN7S3313C12v2Ev
  virtual void  v3(); // _ZN7S3313C12v3Ev
  virtual void  v4(); // _ZN7S3313C12v4Ev
  S3313C1(); // tgen
};
//SIG(1 S3313C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3 v4 FC4}


 S3313C1 ::~S3313C1(){ note_dtor("S3313C1", this);}
void  S3313C1 ::v1(){vfunc_called(this, "_ZN7S3313C12v1Ev");}
void  S3313C1 ::v2(){vfunc_called(this, "_ZN7S3313C12v2Ev");}
void  S3313C1 ::v3(){vfunc_called(this, "_ZN7S3313C12v3Ev");}
void  S3313C1 ::v4(){vfunc_called(this, "_ZN7S3313C12v4Ev");}
S3313C1 ::S3313C1(){ note_ctor("S3313C1", this);} // tgen

static void Test_S3313C1()
{
  extern Class_Descriptor cd_S3313C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(27,35)];
    init_test(&cd_S3313C1, buf);
    S3313C1 *dp, &lv = *(dp=new (buf) S3313C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(208,136), "sizeof(S3313C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3313C1)");
    check_base_class_offset(lv, (S3313C3*)(S3313C2*), 0, "S3313C1");
    check_base_class_offset(lv, (S3313C2*), 0, "S3313C1");
    check_field_offset(lv, s3313c1f0, ABISELECT(184,120), "S3313C1.s3313c1f0");
    test_class_info(&lv, &cd_S3313C1);
    dp->~S3313C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3313C1(Test_S3313C1, "S3313C1", ABISELECT(208,136));

#else // __cplusplus

extern void _ZN7S3313C1C1Ev();
extern void _ZN7S3313C1D1Ev();
Name_Map name_map_S3313C1[] = {
  NSPAIR(_ZN7S3313C1C1Ev),
  NSPAIR(_ZN7S3313C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3313C3;
extern VTBL_ENTRY _ZTI7S3313C3[];
extern  VTBL_ENTRY _ZTV7S3313C3[];
extern Class_Descriptor cd_S3313C2;
extern VTBL_ENTRY _ZTI7S3313C2[];
extern  VTBL_ENTRY _ZTV7S3313C2[];
static Base_Class bases_S3313C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3313C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3313C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3313C1[];
extern void _ZN7S3313C1D1Ev();
extern void _ZN7S3313C1D0Ev();
extern void _ZN7S3313C32v5Ev();
extern void _ZN7S3313C32v6Ev();
extern void _ZN7S3313C32v7Ev();
extern void _ZN7S3313C32v8Ev();
extern void _ZN7S3313C32v9Ev();
extern void _ZN7S3313C33v10Ev();
extern void _ZN7S3313C33v11Ev();
extern void _ZN7S3313C33v12Ev();
extern void _ZN7S3313C33v13Ev();
extern void _ZN7S3313C33v14Ev();
extern void _ZN7S3313C23v15Ev();
extern void _ZN7S3313C23v16Ev();
extern void _ZN7S3313C23v17Ev();
extern void _ZN7S3313C23v18Ev();
extern void _ZN7S3313C23v19Ev();
extern void _ZN7S3313C12v1Ev();
extern void _ZN7S3313C12v2Ev();
extern void _ZN7S3313C12v3Ev();
extern void _ZN7S3313C12v4Ev();
static  VTBL_ENTRY vtc_S3313C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3313C1[0]),
  (VTBL_ENTRY)&_ZN7S3313C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3313C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3313C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3313C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3313C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3313C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3313C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3313C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3313C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3313C1[];
extern  VTBL_ENTRY _ZTV7S3313C1[];
Class_Descriptor cd_S3313C1 = {  "S3313C1", // class name
  bases_S3313C1, 2,
  &(vtc_S3313C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(208,136), // object size
  NSPAIRA(_ZTI7S3313C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3313C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3183C3  {
  void *s3183c3f0[2];
  ::S10103C13_nt s3183c3f1;
  void *s3183c3f2;
  virtual  ~S3183C3(); // _ZN7S3183C3D1Ev
  virtual void  v3(); // _ZN7S3183C32v3Ev
  virtual void  v4(); // _ZN7S3183C32v4Ev
  virtual void  v5(); // _ZN7S3183C32v5Ev
  virtual void  v6(); // _ZN7S3183C32v6Ev
  virtual void  v7(); // _ZN7S3183C32v7Ev
  virtual void  v8(); // _ZN7S3183C32v8Ev
  virtual void  v9(); // _ZN7S3183C32v9Ev
  virtual void  v10(); // _ZN7S3183C33v10Ev
  virtual void  v11(); // _ZN7S3183C33v11Ev
  virtual void  v12(); // _ZN7S3183C33v12Ev
  S3183C3(); // tgen
};
//SIG(-1 S3183C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3183C3 ::~S3183C3(){ note_dtor("S3183C3", this);}
void  S3183C3 ::v3(){vfunc_called(this, "_ZN7S3183C32v3Ev");}
void  S3183C3 ::v4(){vfunc_called(this, "_ZN7S3183C32v4Ev");}
void  S3183C3 ::v5(){vfunc_called(this, "_ZN7S3183C32v5Ev");}
void  S3183C3 ::v6(){vfunc_called(this, "_ZN7S3183C32v6Ev");}
void  S3183C3 ::v7(){vfunc_called(this, "_ZN7S3183C32v7Ev");}
void  S3183C3 ::v8(){vfunc_called(this, "_ZN7S3183C32v8Ev");}
void  S3183C3 ::v9(){vfunc_called(this, "_ZN7S3183C32v9Ev");}
void  S3183C3 ::v10(){vfunc_called(this, "_ZN7S3183C33v10Ev");}
void  S3183C3 ::v11(){vfunc_called(this, "_ZN7S3183C33v11Ev");}
void  S3183C3 ::v12(){vfunc_called(this, "_ZN7S3183C33v12Ev");}
S3183C3 ::S3183C3(){ note_ctor("S3183C3", this);} // tgen

static void Test_S3183C3()
{
  extern Class_Descriptor cd_S3183C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3183C3, buf);
    S3183C3 *dp, &lv = *(dp=new (buf) S3183C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3183C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3183C3)");
    check_field_offset(lv, s3183c3f0, ABISELECT(8,4), "S3183C3.s3183c3f0");
    check_field_offset(lv, s3183c3f1, ABISELECT(24,12), "S3183C3.s3183c3f1");
    check_field_offset(lv, s3183c3f2, ABISELECT(48,28), "S3183C3.s3183c3f2");
    test_class_info(&lv, &cd_S3183C3);
    dp->~S3183C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3183C3(Test_S3183C3, "S3183C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3183C3C1Ev();
extern void _ZN7S3183C3D1Ev();
Name_Map name_map_S3183C3[] = {
  NSPAIR(_ZN7S3183C3C1Ev),
  NSPAIR(_ZN7S3183C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3183C3[];
extern void _ZN7S3183C3D1Ev();
extern void _ZN7S3183C3D0Ev();
extern void _ZN7S3183C32v3Ev();
extern void _ZN7S3183C32v4Ev();
extern void _ZN7S3183C32v5Ev();
extern void _ZN7S3183C32v6Ev();
extern void _ZN7S3183C32v7Ev();
extern void _ZN7S3183C32v8Ev();
extern void _ZN7S3183C32v9Ev();
extern void _ZN7S3183C33v10Ev();
extern void _ZN7S3183C33v11Ev();
extern void _ZN7S3183C33v12Ev();
static  VTBL_ENTRY vtc_S3183C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3183C3[0]),
  (VTBL_ENTRY)&_ZN7S3183C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3183C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v12Ev,
};
extern VTBL_ENTRY _ZTI7S3183C3[];
extern  VTBL_ENTRY _ZTV7S3183C3[];
Class_Descriptor cd_S3183C3 = {  "S3183C3", // class name
  0,0,//no base classes
  &(vtc_S3183C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3183C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3183C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3183C2  : S3183C3 {
  void *s3183c2f0;
  int s3183c2f1;
  ::S10103C86 s3183c2f2;
  ::S10103C82_nt s3183c2f3;
  int s3183c2f4;
  virtual  ~S3183C2(); // _ZN7S3183C2D1Ev
  virtual void  v13(); // _ZN7S3183C23v13Ev
  virtual void  v14(); // _ZN7S3183C23v14Ev
  virtual void  v15(); // _ZN7S3183C23v15Ev
  virtual void  v16(); // _ZN7S3183C23v16Ev
  virtual void  v17(); // _ZN7S3183C23v17Ev
  virtual void  v18(); // _ZN7S3183C23v18Ev
  S3183C2(); // tgen
};
//SIG(-1 S3183C2) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp Fi FC6{ m Fp Fi FC7{ m} FC8{ m}} FC9{ m FC10{ m FL[2]}} Fi}


 S3183C2 ::~S3183C2(){ note_dtor("S3183C2", this);}
void  S3183C2 ::v13(){vfunc_called(this, "_ZN7S3183C23v13Ev");}
void  S3183C2 ::v14(){vfunc_called(this, "_ZN7S3183C23v14Ev");}
void  S3183C2 ::v15(){vfunc_called(this, "_ZN7S3183C23v15Ev");}
void  S3183C2 ::v16(){vfunc_called(this, "_ZN7S3183C23v16Ev");}
void  S3183C2 ::v17(){vfunc_called(this, "_ZN7S3183C23v17Ev");}
void  S3183C2 ::v18(){vfunc_called(this, "_ZN7S3183C23v18Ev");}
S3183C2 ::S3183C2(){ note_ctor("S3183C2", this);} // tgen

static void Test_S3183C2()
{
  extern Class_Descriptor cd_S3183C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,19)];
    init_test(&cd_S3183C2, buf);
    S3183C2 *dp, &lv = *(dp=new (buf) S3183C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,72), "sizeof(S3183C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3183C2)");
    check_base_class_offset(lv, (S3183C3*), 0, "S3183C2");
    check_field_offset(lv, s3183c2f0, ABISELECT(56,32), "S3183C2.s3183c2f0");
    check_field_offset(lv, s3183c2f1, ABISELECT(64,36), "S3183C2.s3183c2f1");
    check_field_offset(lv, s3183c2f2, ABISELECT(72,40), "S3183C2.s3183c2f2");
    check_field_offset(lv, s3183c2f3, ABISELECT(88,52), "S3183C2.s3183c2f3");
    check_field_offset(lv, s3183c2f4, ABISELECT(104,68), "S3183C2.s3183c2f4");
    test_class_info(&lv, &cd_S3183C2);
    dp->~S3183C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3183C2(Test_S3183C2, "S3183C2", ABISELECT(112,72));

#else // __cplusplus

extern void _ZN7S3183C2C1Ev();
extern void _ZN7S3183C2D1Ev();
Name_Map name_map_S3183C2[] = {
  NSPAIR(_ZN7S3183C2C1Ev),
  NSPAIR(_ZN7S3183C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3183C3;
extern VTBL_ENTRY _ZTI7S3183C3[];
extern  VTBL_ENTRY _ZTV7S3183C3[];
static Base_Class bases_S3183C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3183C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3183C2[];
extern void _ZN7S3183C2D1Ev();
extern void _ZN7S3183C2D0Ev();
extern void _ZN7S3183C32v3Ev();
extern void _ZN7S3183C32v4Ev();
extern void _ZN7S3183C32v5Ev();
extern void _ZN7S3183C32v6Ev();
extern void _ZN7S3183C32v7Ev();
extern void _ZN7S3183C32v8Ev();
extern void _ZN7S3183C32v9Ev();
extern void _ZN7S3183C33v10Ev();
extern void _ZN7S3183C33v11Ev();
extern void _ZN7S3183C33v12Ev();
extern void _ZN7S3183C23v13Ev();
extern void _ZN7S3183C23v14Ev();
extern void _ZN7S3183C23v15Ev();
extern void _ZN7S3183C23v16Ev();
extern void _ZN7S3183C23v17Ev();
extern void _ZN7S3183C23v18Ev();
static  VTBL_ENTRY vtc_S3183C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3183C2[0]),
  (VTBL_ENTRY)&_ZN7S3183C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3183C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v18Ev,
};
extern VTBL_ENTRY _ZTI7S3183C2[];
extern  VTBL_ENTRY _ZTV7S3183C2[];
Class_Descriptor cd_S3183C2 = {  "S3183C2", // class name
  bases_S3183C2, 1,
  &(vtc_S3183C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(112,72), // object size
  NSPAIRA(_ZTI7S3183C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3183C2),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3183C1  : S3183C2 {
  virtual  ~S3183C1(); // _ZN7S3183C1D1Ev
  virtual void  v1(); // _ZN7S3183C12v1Ev
  virtual void  v2(); // _ZN7S3183C12v2Ev
  S3183C1(); // tgen
};
//SIG(1 S3183C1) C1{ BC2{ BC3{ vd v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v13 v14 v15 v16 v17 v18 Fp Fi FC7{ m Fp Fi FC8{ m} FC9{ m}} FC10{ m FC11{ m FL[2]}} Fi} vd v1 v2}


 S3183C1 ::~S3183C1(){ note_dtor("S3183C1", this);}
void  S3183C1 ::v1(){vfunc_called(this, "_ZN7S3183C12v1Ev");}
void  S3183C1 ::v2(){vfunc_called(this, "_ZN7S3183C12v2Ev");}
S3183C1 ::S3183C1(){ note_ctor("S3183C1", this);} // tgen

static void Test_S3183C1()
{
  extern Class_Descriptor cd_S3183C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,19)];
    init_test(&cd_S3183C1, buf);
    S3183C1 *dp, &lv = *(dp=new (buf) S3183C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,72), "sizeof(S3183C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3183C1)");
    check_base_class_offset(lv, (S3183C3*)(S3183C2*), 0, "S3183C1");
    check_base_class_offset(lv, (S3183C2*), 0, "S3183C1");
    test_class_info(&lv, &cd_S3183C1);
    dp->~S3183C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3183C1(Test_S3183C1, "S3183C1", ABISELECT(112,72));

#else // __cplusplus

extern void _ZN7S3183C1C1Ev();
extern void _ZN7S3183C1D1Ev();
Name_Map name_map_S3183C1[] = {
  NSPAIR(_ZN7S3183C1C1Ev),
  NSPAIR(_ZN7S3183C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3183C3;
extern VTBL_ENTRY _ZTI7S3183C3[];
extern  VTBL_ENTRY _ZTV7S3183C3[];
extern Class_Descriptor cd_S3183C2;
extern VTBL_ENTRY _ZTI7S3183C2[];
extern  VTBL_ENTRY _ZTV7S3183C2[];
static Base_Class bases_S3183C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3183C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3183C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3183C1[];
extern void _ZN7S3183C1D1Ev();
extern void _ZN7S3183C1D0Ev();
extern void _ZN7S3183C32v3Ev();
extern void _ZN7S3183C32v4Ev();
extern void _ZN7S3183C32v5Ev();
extern void _ZN7S3183C32v6Ev();
extern void _ZN7S3183C32v7Ev();
extern void _ZN7S3183C32v8Ev();
extern void _ZN7S3183C32v9Ev();
extern void _ZN7S3183C33v10Ev();
extern void _ZN7S3183C33v11Ev();
extern void _ZN7S3183C33v12Ev();
extern void _ZN7S3183C23v13Ev();
extern void _ZN7S3183C23v14Ev();
extern void _ZN7S3183C23v15Ev();
extern void _ZN7S3183C23v16Ev();
extern void _ZN7S3183C23v17Ev();
extern void _ZN7S3183C23v18Ev();
extern void _ZN7S3183C12v1Ev();
extern void _ZN7S3183C12v2Ev();
static  VTBL_ENTRY vtc_S3183C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3183C1[0]),
  (VTBL_ENTRY)&_ZN7S3183C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3183C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3183C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3183C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3183C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3183C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3183C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S3183C1[];
extern  VTBL_ENTRY _ZTV7S3183C1[];
Class_Descriptor cd_S3183C1 = {  "S3183C1", // class name
  bases_S3183C1, 2,
  &(vtc_S3183C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(112,72), // object size
  NSPAIRA(_ZTI7S3183C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3183C1),22, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3307C3  {
  void *s3307c3f0[2];
  ::S10103C13_nt s3307c3f1;
  void *s3307c3f2;
  virtual  ~S3307C3(); // _ZN7S3307C3D1Ev
  virtual void  v5(); // _ZN7S3307C32v5Ev
  virtual void  v6(); // _ZN7S3307C32v6Ev
  virtual void  v7(); // _ZN7S3307C32v7Ev
  virtual void  v8(); // _ZN7S3307C32v8Ev
  virtual void  v9(); // _ZN7S3307C32v9Ev
  virtual void  v10(); // _ZN7S3307C33v10Ev
  virtual void  v11(); // _ZN7S3307C33v11Ev
  virtual void  v12(); // _ZN7S3307C33v12Ev
  virtual void  v13(); // _ZN7S3307C33v13Ev
  virtual void  v14(); // _ZN7S3307C33v14Ev
  S3307C3(); // tgen
};
//SIG(-1 S3307C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3307C3 ::~S3307C3(){ note_dtor("S3307C3", this);}
void  S3307C3 ::v5(){vfunc_called(this, "_ZN7S3307C32v5Ev");}
void  S3307C3 ::v6(){vfunc_called(this, "_ZN7S3307C32v6Ev");}
void  S3307C3 ::v7(){vfunc_called(this, "_ZN7S3307C32v7Ev");}
void  S3307C3 ::v8(){vfunc_called(this, "_ZN7S3307C32v8Ev");}
void  S3307C3 ::v9(){vfunc_called(this, "_ZN7S3307C32v9Ev");}
void  S3307C3 ::v10(){vfunc_called(this, "_ZN7S3307C33v10Ev");}
void  S3307C3 ::v11(){vfunc_called(this, "_ZN7S3307C33v11Ev");}
void  S3307C3 ::v12(){vfunc_called(this, "_ZN7S3307C33v12Ev");}
void  S3307C3 ::v13(){vfunc_called(this, "_ZN7S3307C33v13Ev");}
void  S3307C3 ::v14(){vfunc_called(this, "_ZN7S3307C33v14Ev");}
S3307C3 ::S3307C3(){ note_ctor("S3307C3", this);} // tgen

static void Test_S3307C3()
{
  extern Class_Descriptor cd_S3307C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3307C3, buf);
    S3307C3 *dp, &lv = *(dp=new (buf) S3307C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3307C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3307C3)");
    check_field_offset(lv, s3307c3f0, ABISELECT(8,4), "S3307C3.s3307c3f0");
    check_field_offset(lv, s3307c3f1, ABISELECT(24,12), "S3307C3.s3307c3f1");
    check_field_offset(lv, s3307c3f2, ABISELECT(48,28), "S3307C3.s3307c3f2");
    test_class_info(&lv, &cd_S3307C3);
    dp->~S3307C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3307C3(Test_S3307C3, "S3307C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3307C3C1Ev();
extern void _ZN7S3307C3D1Ev();
Name_Map name_map_S3307C3[] = {
  NSPAIR(_ZN7S3307C3C1Ev),
  NSPAIR(_ZN7S3307C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3307C3[];
extern void _ZN7S3307C3D1Ev();
extern void _ZN7S3307C3D0Ev();
extern void _ZN7S3307C32v5Ev();
extern void _ZN7S3307C32v6Ev();
extern void _ZN7S3307C32v7Ev();
extern void _ZN7S3307C32v8Ev();
extern void _ZN7S3307C32v9Ev();
extern void _ZN7S3307C33v10Ev();
extern void _ZN7S3307C33v11Ev();
extern void _ZN7S3307C33v12Ev();
extern void _ZN7S3307C33v13Ev();
extern void _ZN7S3307C33v14Ev();
static  VTBL_ENTRY vtc_S3307C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3307C3[0]),
  (VTBL_ENTRY)&_ZN7S3307C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3307C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3307C3[];
extern  VTBL_ENTRY _ZTV7S3307C3[];
Class_Descriptor cd_S3307C3 = {  "S3307C3", // class name
  0,0,//no base classes
  &(vtc_S3307C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3307C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3307C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3307C2  : S3307C3 {
  void *s3307c2f0;
  ::S10103C13_nt s3307c2f1;
  ::S10103C13_nt s3307c2f2;
  ::S10103C13_nt s3307c2f3;
  ::S10103C86 s3307c2f4;
  ::S10103C86 s3307c2f5;
  ::S10103C86 s3307c2f6;
  virtual  ~S3307C2(); // _ZN7S3307C2D1Ev
  virtual void  v15(); // _ZN7S3307C23v15Ev
  virtual void  v16(); // _ZN7S3307C23v16Ev
  virtual void  v17(); // _ZN7S3307C23v17Ev
  virtual void  v18(); // _ZN7S3307C23v18Ev
  virtual void  v19(); // _ZN7S3307C23v19Ev
  S3307C2(); // tgen
};
//SIG(-1 S3307C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3307C2 ::~S3307C2(){ note_dtor("S3307C2", this);}
void  S3307C2 ::v15(){vfunc_called(this, "_ZN7S3307C23v15Ev");}
void  S3307C2 ::v16(){vfunc_called(this, "_ZN7S3307C23v16Ev");}
void  S3307C2 ::v17(){vfunc_called(this, "_ZN7S3307C23v17Ev");}
void  S3307C2 ::v18(){vfunc_called(this, "_ZN7S3307C23v18Ev");}
void  S3307C2 ::v19(){vfunc_called(this, "_ZN7S3307C23v19Ev");}
S3307C2 ::S3307C2(){ note_ctor("S3307C2", this);} // tgen

static void Test_S3307C2()
{
  extern Class_Descriptor cd_S3307C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3307C2, buf);
    S3307C2 *dp, &lv = *(dp=new (buf) S3307C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3307C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3307C2)");
    check_base_class_offset(lv, (S3307C3*), 0, "S3307C2");
    check_field_offset(lv, s3307c2f0, ABISELECT(56,32), "S3307C2.s3307c2f0");
    check_field_offset(lv, s3307c2f1, ABISELECT(64,36), "S3307C2.s3307c2f1");
    check_field_offset(lv, s3307c2f2, ABISELECT(88,52), "S3307C2.s3307c2f2");
    check_field_offset(lv, s3307c2f3, ABISELECT(112,68), "S3307C2.s3307c2f3");
    check_field_offset(lv, s3307c2f4, ABISELECT(136,84), "S3307C2.s3307c2f4");
    check_field_offset(lv, s3307c2f5, ABISELECT(152,96), "S3307C2.s3307c2f5");
    check_field_offset(lv, s3307c2f6, ABISELECT(168,108), "S3307C2.s3307c2f6");
    test_class_info(&lv, &cd_S3307C2);
    dp->~S3307C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3307C2(Test_S3307C2, "S3307C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3307C2C1Ev();
extern void _ZN7S3307C2D1Ev();
Name_Map name_map_S3307C2[] = {
  NSPAIR(_ZN7S3307C2C1Ev),
  NSPAIR(_ZN7S3307C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3307C3;
extern VTBL_ENTRY _ZTI7S3307C3[];
extern  VTBL_ENTRY _ZTV7S3307C3[];
static Base_Class bases_S3307C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3307C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3307C2[];
extern void _ZN7S3307C2D1Ev();
extern void _ZN7S3307C2D0Ev();
extern void _ZN7S3307C32v5Ev();
extern void _ZN7S3307C32v6Ev();
extern void _ZN7S3307C32v7Ev();
extern void _ZN7S3307C32v8Ev();
extern void _ZN7S3307C32v9Ev();
extern void _ZN7S3307C33v10Ev();
extern void _ZN7S3307C33v11Ev();
extern void _ZN7S3307C33v12Ev();
extern void _ZN7S3307C33v13Ev();
extern void _ZN7S3307C33v14Ev();
extern void _ZN7S3307C23v15Ev();
extern void _ZN7S3307C23v16Ev();
extern void _ZN7S3307C23v17Ev();
extern void _ZN7S3307C23v18Ev();
extern void _ZN7S3307C23v19Ev();
static  VTBL_ENTRY vtc_S3307C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3307C2[0]),
  (VTBL_ENTRY)&_ZN7S3307C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3307C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3307C2[];
extern  VTBL_ENTRY _ZTV7S3307C2[];
Class_Descriptor cd_S3307C2 = {  "S3307C2", // class name
  bases_S3307C2, 1,
  &(vtc_S3307C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3307C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3307C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3307C1  : S3307C2 {
  ::S10103C13_nt s3307c1f0;
  virtual void  v1(); // _ZN7S3307C12v1Ev
  virtual void  v2(); // _ZN7S3307C12v2Ev
  virtual void  v3(); // _ZN7S3307C12v3Ev
  virtual void  v4(); // _ZN7S3307C12v4Ev
  ~S3307C1(); // tgen
  S3307C1(); // tgen
};
//SIG(1 S3307C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4 FC4}


void  S3307C1 ::v1(){vfunc_called(this, "_ZN7S3307C12v1Ev");}
void  S3307C1 ::v2(){vfunc_called(this, "_ZN7S3307C12v2Ev");}
void  S3307C1 ::v3(){vfunc_called(this, "_ZN7S3307C12v3Ev");}
void  S3307C1 ::v4(){vfunc_called(this, "_ZN7S3307C12v4Ev");}
S3307C1 ::~S3307C1(){ note_dtor("S3307C1", this);} // tgen
S3307C1 ::S3307C1(){ note_ctor("S3307C1", this);} // tgen

static void Test_S3307C1()
{
  extern Class_Descriptor cd_S3307C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(27,35)];
    init_test(&cd_S3307C1, buf);
    S3307C1 *dp, &lv = *(dp=new (buf) S3307C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(208,136), "sizeof(S3307C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3307C1)");
    check_base_class_offset(lv, (S3307C3*)(S3307C2*), 0, "S3307C1");
    check_base_class_offset(lv, (S3307C2*), 0, "S3307C1");
    check_field_offset(lv, s3307c1f0, ABISELECT(184,120), "S3307C1.s3307c1f0");
    test_class_info(&lv, &cd_S3307C1);
    dp->~S3307C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3307C1(Test_S3307C1, "S3307C1", ABISELECT(208,136));

#else // __cplusplus

extern void _ZN7S3307C1C1Ev();
extern void _ZN7S3307C1D1Ev();
Name_Map name_map_S3307C1[] = {
  NSPAIR(_ZN7S3307C1C1Ev),
  NSPAIR(_ZN7S3307C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3307C3;
extern VTBL_ENTRY _ZTI7S3307C3[];
extern  VTBL_ENTRY _ZTV7S3307C3[];
extern Class_Descriptor cd_S3307C2;
extern VTBL_ENTRY _ZTI7S3307C2[];
extern  VTBL_ENTRY _ZTV7S3307C2[];
static Base_Class bases_S3307C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3307C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3307C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3307C1[];
extern void _ZN7S3307C1D1Ev();
extern void _ZN7S3307C1D0Ev();
extern void _ZN7S3307C32v5Ev();
extern void _ZN7S3307C32v6Ev();
extern void _ZN7S3307C32v7Ev();
extern void _ZN7S3307C32v8Ev();
extern void _ZN7S3307C32v9Ev();
extern void _ZN7S3307C33v10Ev();
extern void _ZN7S3307C33v11Ev();
extern void _ZN7S3307C33v12Ev();
extern void _ZN7S3307C33v13Ev();
extern void _ZN7S3307C33v14Ev();
extern void _ZN7S3307C23v15Ev();
extern void _ZN7S3307C23v16Ev();
extern void _ZN7S3307C23v17Ev();
extern void _ZN7S3307C23v18Ev();
extern void _ZN7S3307C23v19Ev();
extern void _ZN7S3307C12v1Ev();
extern void _ZN7S3307C12v2Ev();
extern void _ZN7S3307C12v3Ev();
extern void _ZN7S3307C12v4Ev();
static  VTBL_ENTRY vtc_S3307C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3307C1[0]),
  (VTBL_ENTRY)&_ZN7S3307C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3307C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3307C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3307C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3307C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3307C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3307C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3307C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3307C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3307C1[];
extern  VTBL_ENTRY _ZTV7S3307C1[];
Class_Descriptor cd_S3307C1 = {  "S3307C1", // class name
  bases_S3307C1, 2,
  &(vtc_S3307C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(208,136), // object size
  NSPAIRA(_ZTI7S3307C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3307C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3258C3  {
  void *s3258c3f0[2];
  ::S10103C13_nt s3258c3f1;
  void *s3258c3f2;
  virtual  ~S3258C3(); // _ZN7S3258C3D1Ev
  virtual void  v4(); // _ZN7S3258C32v4Ev
  virtual void  v5(); // _ZN7S3258C32v5Ev
  virtual void  v6(); // _ZN7S3258C32v6Ev
  virtual void  v7(); // _ZN7S3258C32v7Ev
  virtual void  v8(); // _ZN7S3258C32v8Ev
  virtual void  v9(); // _ZN7S3258C32v9Ev
  virtual void  v10(); // _ZN7S3258C33v10Ev
  virtual void  v11(); // _ZN7S3258C33v11Ev
  virtual void  v12(); // _ZN7S3258C33v12Ev
  virtual void  v13(); // _ZN7S3258C33v13Ev
  S3258C3(); // tgen
};
//SIG(-1 S3258C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3258C3 ::~S3258C3(){ note_dtor("S3258C3", this);}
void  S3258C3 ::v4(){vfunc_called(this, "_ZN7S3258C32v4Ev");}
void  S3258C3 ::v5(){vfunc_called(this, "_ZN7S3258C32v5Ev");}
void  S3258C3 ::v6(){vfunc_called(this, "_ZN7S3258C32v6Ev");}
void  S3258C3 ::v7(){vfunc_called(this, "_ZN7S3258C32v7Ev");}
void  S3258C3 ::v8(){vfunc_called(this, "_ZN7S3258C32v8Ev");}
void  S3258C3 ::v9(){vfunc_called(this, "_ZN7S3258C32v9Ev");}
void  S3258C3 ::v10(){vfunc_called(this, "_ZN7S3258C33v10Ev");}
void  S3258C3 ::v11(){vfunc_called(this, "_ZN7S3258C33v11Ev");}
void  S3258C3 ::v12(){vfunc_called(this, "_ZN7S3258C33v12Ev");}
void  S3258C3 ::v13(){vfunc_called(this, "_ZN7S3258C33v13Ev");}
S3258C3 ::S3258C3(){ note_ctor("S3258C3", this);} // tgen

static void Test_S3258C3()
{
  extern Class_Descriptor cd_S3258C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3258C3, buf);
    S3258C3 *dp, &lv = *(dp=new (buf) S3258C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3258C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3258C3)");
    check_field_offset(lv, s3258c3f0, ABISELECT(8,4), "S3258C3.s3258c3f0");
    check_field_offset(lv, s3258c3f1, ABISELECT(24,12), "S3258C3.s3258c3f1");
    check_field_offset(lv, s3258c3f2, ABISELECT(48,28), "S3258C3.s3258c3f2");
    test_class_info(&lv, &cd_S3258C3);
    dp->~S3258C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3258C3(Test_S3258C3, "S3258C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3258C3C1Ev();
extern void _ZN7S3258C3D1Ev();
Name_Map name_map_S3258C3[] = {
  NSPAIR(_ZN7S3258C3C1Ev),
  NSPAIR(_ZN7S3258C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3258C3[];
extern void _ZN7S3258C3D1Ev();
extern void _ZN7S3258C3D0Ev();
extern void _ZN7S3258C32v4Ev();
extern void _ZN7S3258C32v5Ev();
extern void _ZN7S3258C32v6Ev();
extern void _ZN7S3258C32v7Ev();
extern void _ZN7S3258C32v8Ev();
extern void _ZN7S3258C32v9Ev();
extern void _ZN7S3258C33v10Ev();
extern void _ZN7S3258C33v11Ev();
extern void _ZN7S3258C33v12Ev();
extern void _ZN7S3258C33v13Ev();
static  VTBL_ENTRY vtc_S3258C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3258C3[0]),
  (VTBL_ENTRY)&_ZN7S3258C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3258C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v13Ev,
};
extern VTBL_ENTRY _ZTI7S3258C3[];
extern  VTBL_ENTRY _ZTV7S3258C3[];
Class_Descriptor cd_S3258C3 = {  "S3258C3", // class name
  0,0,//no base classes
  &(vtc_S3258C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3258C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3258C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3258C2  : S3258C3 {
  void *s3258c2f0;
  ::S10103C13_nt s3258c2f1;
  ::S10103C13_nt s3258c2f2;
  ::S10103C13_nt s3258c2f3;
  ::S10103C86 s3258c2f4;
  ::S10103C86 s3258c2f5;
  ::S10103C86 s3258c2f6;
  virtual  ~S3258C2(); // _ZN7S3258C2D1Ev
  virtual void  v14(); // _ZN7S3258C23v14Ev
  virtual void  v15(); // _ZN7S3258C23v15Ev
  virtual void  v16(); // _ZN7S3258C23v16Ev
  virtual void  v17(); // _ZN7S3258C23v17Ev
  virtual void  v18(); // _ZN7S3258C23v18Ev
  S3258C2(); // tgen
};
//SIG(-1 S3258C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3258C2 ::~S3258C2(){ note_dtor("S3258C2", this);}
void  S3258C2 ::v14(){vfunc_called(this, "_ZN7S3258C23v14Ev");}
void  S3258C2 ::v15(){vfunc_called(this, "_ZN7S3258C23v15Ev");}
void  S3258C2 ::v16(){vfunc_called(this, "_ZN7S3258C23v16Ev");}
void  S3258C2 ::v17(){vfunc_called(this, "_ZN7S3258C23v17Ev");}
void  S3258C2 ::v18(){vfunc_called(this, "_ZN7S3258C23v18Ev");}
S3258C2 ::S3258C2(){ note_ctor("S3258C2", this);} // tgen

static void Test_S3258C2()
{
  extern Class_Descriptor cd_S3258C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3258C2, buf);
    S3258C2 *dp, &lv = *(dp=new (buf) S3258C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3258C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3258C2)");
    check_base_class_offset(lv, (S3258C3*), 0, "S3258C2");
    check_field_offset(lv, s3258c2f0, ABISELECT(56,32), "S3258C2.s3258c2f0");
    check_field_offset(lv, s3258c2f1, ABISELECT(64,36), "S3258C2.s3258c2f1");
    check_field_offset(lv, s3258c2f2, ABISELECT(88,52), "S3258C2.s3258c2f2");
    check_field_offset(lv, s3258c2f3, ABISELECT(112,68), "S3258C2.s3258c2f3");
    check_field_offset(lv, s3258c2f4, ABISELECT(136,84), "S3258C2.s3258c2f4");
    check_field_offset(lv, s3258c2f5, ABISELECT(152,96), "S3258C2.s3258c2f5");
    check_field_offset(lv, s3258c2f6, ABISELECT(168,108), "S3258C2.s3258c2f6");
    test_class_info(&lv, &cd_S3258C2);
    dp->~S3258C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3258C2(Test_S3258C2, "S3258C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3258C2C1Ev();
extern void _ZN7S3258C2D1Ev();
Name_Map name_map_S3258C2[] = {
  NSPAIR(_ZN7S3258C2C1Ev),
  NSPAIR(_ZN7S3258C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3258C3;
extern VTBL_ENTRY _ZTI7S3258C3[];
extern  VTBL_ENTRY _ZTV7S3258C3[];
static Base_Class bases_S3258C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3258C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3258C2[];
extern void _ZN7S3258C2D1Ev();
extern void _ZN7S3258C2D0Ev();
extern void _ZN7S3258C32v4Ev();
extern void _ZN7S3258C32v5Ev();
extern void _ZN7S3258C32v6Ev();
extern void _ZN7S3258C32v7Ev();
extern void _ZN7S3258C32v8Ev();
extern void _ZN7S3258C32v9Ev();
extern void _ZN7S3258C33v10Ev();
extern void _ZN7S3258C33v11Ev();
extern void _ZN7S3258C33v12Ev();
extern void _ZN7S3258C33v13Ev();
extern void _ZN7S3258C23v14Ev();
extern void _ZN7S3258C23v15Ev();
extern void _ZN7S3258C23v16Ev();
extern void _ZN7S3258C23v17Ev();
extern void _ZN7S3258C23v18Ev();
static  VTBL_ENTRY vtc_S3258C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3258C2[0]),
  (VTBL_ENTRY)&_ZN7S3258C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3258C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v18Ev,
};
extern VTBL_ENTRY _ZTI7S3258C2[];
extern  VTBL_ENTRY _ZTV7S3258C2[];
Class_Descriptor cd_S3258C2 = {  "S3258C2", // class name
  bases_S3258C2, 1,
  &(vtc_S3258C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3258C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3258C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3258C1  : S3258C2 {
  char s3258c1f0;
  int s3258c1f1;
  virtual void  v1(); // _ZN7S3258C12v1Ev
  virtual void  v2(); // _ZN7S3258C12v2Ev
  virtual void  v3(); // _ZN7S3258C12v3Ev
  ~S3258C1(); // tgen
  S3258C1(); // tgen
};
//SIG(1 S3258C1) C1{ BC2{ BC3{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 Fc Fi}


void  S3258C1 ::v1(){vfunc_called(this, "_ZN7S3258C12v1Ev");}
void  S3258C1 ::v2(){vfunc_called(this, "_ZN7S3258C12v2Ev");}
void  S3258C1 ::v3(){vfunc_called(this, "_ZN7S3258C12v3Ev");}
S3258C1 ::~S3258C1(){ note_dtor("S3258C1", this);} // tgen
S3258C1 ::S3258C1(){ note_ctor("S3258C1", this);} // tgen

static void Test_S3258C1()
{
  extern Class_Descriptor cd_S3258C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,33)];
    init_test(&cd_S3258C1, buf);
    S3258C1 *dp, &lv = *(dp=new (buf) S3258C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,128), "sizeof(S3258C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3258C1)");
    check_base_class_offset(lv, (S3258C3*)(S3258C2*), 0, "S3258C1");
    check_base_class_offset(lv, (S3258C2*), 0, "S3258C1");
    check_field_offset(lv, s3258c1f0, ABISELECT(184,120), "S3258C1.s3258c1f0");
    check_field_offset(lv, s3258c1f1, ABISELECT(188,124), "S3258C1.s3258c1f1");
    test_class_info(&lv, &cd_S3258C1);
    dp->~S3258C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3258C1(Test_S3258C1, "S3258C1", ABISELECT(192,128));

#else // __cplusplus

extern void _ZN7S3258C1C1Ev();
extern void _ZN7S3258C1D1Ev();
Name_Map name_map_S3258C1[] = {
  NSPAIR(_ZN7S3258C1C1Ev),
  NSPAIR(_ZN7S3258C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3258C3;
extern VTBL_ENTRY _ZTI7S3258C3[];
extern  VTBL_ENTRY _ZTV7S3258C3[];
extern Class_Descriptor cd_S3258C2;
extern VTBL_ENTRY _ZTI7S3258C2[];
extern  VTBL_ENTRY _ZTV7S3258C2[];
static Base_Class bases_S3258C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3258C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3258C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3258C1[];
extern void _ZN7S3258C1D1Ev();
extern void _ZN7S3258C1D0Ev();
extern void _ZN7S3258C32v4Ev();
extern void _ZN7S3258C32v5Ev();
extern void _ZN7S3258C32v6Ev();
extern void _ZN7S3258C32v7Ev();
extern void _ZN7S3258C32v8Ev();
extern void _ZN7S3258C32v9Ev();
extern void _ZN7S3258C33v10Ev();
extern void _ZN7S3258C33v11Ev();
extern void _ZN7S3258C33v12Ev();
extern void _ZN7S3258C33v13Ev();
extern void _ZN7S3258C23v14Ev();
extern void _ZN7S3258C23v15Ev();
extern void _ZN7S3258C23v16Ev();
extern void _ZN7S3258C23v17Ev();
extern void _ZN7S3258C23v18Ev();
extern void _ZN7S3258C12v1Ev();
extern void _ZN7S3258C12v2Ev();
extern void _ZN7S3258C12v3Ev();
static  VTBL_ENTRY vtc_S3258C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3258C1[0]),
  (VTBL_ENTRY)&_ZN7S3258C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3258C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3258C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3258C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3258C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3258C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3258C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3258C12v3Ev,
};
extern VTBL_ENTRY _ZTI7S3258C1[];
extern  VTBL_ENTRY _ZTV7S3258C1[];
Class_Descriptor cd_S3258C1 = {  "S3258C1", // class name
  bases_S3258C1, 2,
  &(vtc_S3258C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(192,128), // object size
  NSPAIRA(_ZTI7S3258C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3258C1),22, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3310C3  {
  void *s3310c3f0[2];
  ::S10103C13_nt s3310c3f1;
  void *s3310c3f2;
  virtual  ~S3310C3(); // _ZN7S3310C3D1Ev
  virtual void  v5(); // _ZN7S3310C32v5Ev
  virtual void  v6(); // _ZN7S3310C32v6Ev
  virtual void  v7(); // _ZN7S3310C32v7Ev
  virtual void  v8(); // _ZN7S3310C32v8Ev
  virtual void  v9(); // _ZN7S3310C32v9Ev
  virtual void  v10(); // _ZN7S3310C33v10Ev
  virtual void  v11(); // _ZN7S3310C33v11Ev
  virtual void  v12(); // _ZN7S3310C33v12Ev
  virtual void  v13(); // _ZN7S3310C33v13Ev
  virtual void  v14(); // _ZN7S3310C33v14Ev
  S3310C3(); // tgen
};
//SIG(-1 S3310C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3310C3 ::~S3310C3(){ note_dtor("S3310C3", this);}
void  S3310C3 ::v5(){vfunc_called(this, "_ZN7S3310C32v5Ev");}
void  S3310C3 ::v6(){vfunc_called(this, "_ZN7S3310C32v6Ev");}
void  S3310C3 ::v7(){vfunc_called(this, "_ZN7S3310C32v7Ev");}
void  S3310C3 ::v8(){vfunc_called(this, "_ZN7S3310C32v8Ev");}
void  S3310C3 ::v9(){vfunc_called(this, "_ZN7S3310C32v9Ev");}
void  S3310C3 ::v10(){vfunc_called(this, "_ZN7S3310C33v10Ev");}
void  S3310C3 ::v11(){vfunc_called(this, "_ZN7S3310C33v11Ev");}
void  S3310C3 ::v12(){vfunc_called(this, "_ZN7S3310C33v12Ev");}
void  S3310C3 ::v13(){vfunc_called(this, "_ZN7S3310C33v13Ev");}
void  S3310C3 ::v14(){vfunc_called(this, "_ZN7S3310C33v14Ev");}
S3310C3 ::S3310C3(){ note_ctor("S3310C3", this);} // tgen

static void Test_S3310C3()
{
  extern Class_Descriptor cd_S3310C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3310C3, buf);
    S3310C3 *dp, &lv = *(dp=new (buf) S3310C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3310C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3310C3)");
    check_field_offset(lv, s3310c3f0, ABISELECT(8,4), "S3310C3.s3310c3f0");
    check_field_offset(lv, s3310c3f1, ABISELECT(24,12), "S3310C3.s3310c3f1");
    check_field_offset(lv, s3310c3f2, ABISELECT(48,28), "S3310C3.s3310c3f2");
    test_class_info(&lv, &cd_S3310C3);
    dp->~S3310C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3310C3(Test_S3310C3, "S3310C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3310C3C1Ev();
extern void _ZN7S3310C3D1Ev();
Name_Map name_map_S3310C3[] = {
  NSPAIR(_ZN7S3310C3C1Ev),
  NSPAIR(_ZN7S3310C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3310C3[];
extern void _ZN7S3310C3D1Ev();
extern void _ZN7S3310C3D0Ev();
extern void _ZN7S3310C32v5Ev();
extern void _ZN7S3310C32v6Ev();
extern void _ZN7S3310C32v7Ev();
extern void _ZN7S3310C32v8Ev();
extern void _ZN7S3310C32v9Ev();
extern void _ZN7S3310C33v10Ev();
extern void _ZN7S3310C33v11Ev();
extern void _ZN7S3310C33v12Ev();
extern void _ZN7S3310C33v13Ev();
extern void _ZN7S3310C33v14Ev();
static  VTBL_ENTRY vtc_S3310C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3310C3[0]),
  (VTBL_ENTRY)&_ZN7S3310C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3310C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v14Ev,
};
extern VTBL_ENTRY _ZTI7S3310C3[];
extern  VTBL_ENTRY _ZTV7S3310C3[];
Class_Descriptor cd_S3310C3 = {  "S3310C3", // class name
  0,0,//no base classes
  &(vtc_S3310C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3310C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3310C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3310C2  : S3310C3 {
  void *s3310c2f0;
  ::S10103C13_nt s3310c2f1;
  ::S10103C13_nt s3310c2f2;
  ::S10103C13_nt s3310c2f3;
  ::S10103C86 s3310c2f4;
  ::S10103C86 s3310c2f5;
  ::S10103C86 s3310c2f6;
  virtual  ~S3310C2(); // _ZN7S3310C2D1Ev
  virtual void  v15(); // _ZN7S3310C23v15Ev
  virtual void  v16(); // _ZN7S3310C23v16Ev
  virtual void  v17(); // _ZN7S3310C23v17Ev
  virtual void  v18(); // _ZN7S3310C23v18Ev
  virtual void  v19(); // _ZN7S3310C23v19Ev
  S3310C2(); // tgen
};
//SIG(-1 S3310C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3310C2 ::~S3310C2(){ note_dtor("S3310C2", this);}
void  S3310C2 ::v15(){vfunc_called(this, "_ZN7S3310C23v15Ev");}
void  S3310C2 ::v16(){vfunc_called(this, "_ZN7S3310C23v16Ev");}
void  S3310C2 ::v17(){vfunc_called(this, "_ZN7S3310C23v17Ev");}
void  S3310C2 ::v18(){vfunc_called(this, "_ZN7S3310C23v18Ev");}
void  S3310C2 ::v19(){vfunc_called(this, "_ZN7S3310C23v19Ev");}
S3310C2 ::S3310C2(){ note_ctor("S3310C2", this);} // tgen

static void Test_S3310C2()
{
  extern Class_Descriptor cd_S3310C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3310C2, buf);
    S3310C2 *dp, &lv = *(dp=new (buf) S3310C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3310C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3310C2)");
    check_base_class_offset(lv, (S3310C3*), 0, "S3310C2");
    check_field_offset(lv, s3310c2f0, ABISELECT(56,32), "S3310C2.s3310c2f0");
    check_field_offset(lv, s3310c2f1, ABISELECT(64,36), "S3310C2.s3310c2f1");
    check_field_offset(lv, s3310c2f2, ABISELECT(88,52), "S3310C2.s3310c2f2");
    check_field_offset(lv, s3310c2f3, ABISELECT(112,68), "S3310C2.s3310c2f3");
    check_field_offset(lv, s3310c2f4, ABISELECT(136,84), "S3310C2.s3310c2f4");
    check_field_offset(lv, s3310c2f5, ABISELECT(152,96), "S3310C2.s3310c2f5");
    check_field_offset(lv, s3310c2f6, ABISELECT(168,108), "S3310C2.s3310c2f6");
    test_class_info(&lv, &cd_S3310C2);
    dp->~S3310C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3310C2(Test_S3310C2, "S3310C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3310C2C1Ev();
extern void _ZN7S3310C2D1Ev();
Name_Map name_map_S3310C2[] = {
  NSPAIR(_ZN7S3310C2C1Ev),
  NSPAIR(_ZN7S3310C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3310C3;
extern VTBL_ENTRY _ZTI7S3310C3[];
extern  VTBL_ENTRY _ZTV7S3310C3[];
static Base_Class bases_S3310C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3310C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3310C2[];
extern void _ZN7S3310C2D1Ev();
extern void _ZN7S3310C2D0Ev();
extern void _ZN7S3310C32v5Ev();
extern void _ZN7S3310C32v6Ev();
extern void _ZN7S3310C32v7Ev();
extern void _ZN7S3310C32v8Ev();
extern void _ZN7S3310C32v9Ev();
extern void _ZN7S3310C33v10Ev();
extern void _ZN7S3310C33v11Ev();
extern void _ZN7S3310C33v12Ev();
extern void _ZN7S3310C33v13Ev();
extern void _ZN7S3310C33v14Ev();
extern void _ZN7S3310C23v15Ev();
extern void _ZN7S3310C23v16Ev();
extern void _ZN7S3310C23v17Ev();
extern void _ZN7S3310C23v18Ev();
extern void _ZN7S3310C23v19Ev();
static  VTBL_ENTRY vtc_S3310C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3310C2[0]),
  (VTBL_ENTRY)&_ZN7S3310C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3310C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v19Ev,
};
extern VTBL_ENTRY _ZTI7S3310C2[];
extern  VTBL_ENTRY _ZTV7S3310C2[];
Class_Descriptor cd_S3310C2 = {  "S3310C2", // class name
  bases_S3310C2, 1,
  &(vtc_S3310C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3310C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3310C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3310C1  : S3310C2 {
  virtual void  v1(); // _ZN7S3310C12v1Ev
  virtual void  v2(); // _ZN7S3310C12v2Ev
  virtual void  v3(); // _ZN7S3310C12v3Ev
  virtual void  v4(); // _ZN7S3310C12v4Ev
  ~S3310C1(); // tgen
  S3310C1(); // tgen
};
//SIG(1 S3310C1) C1{ BC2{ BC3{ vd v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v15 v16 v17 v18 v19 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1 v2 v3 v4}


void  S3310C1 ::v1(){vfunc_called(this, "_ZN7S3310C12v1Ev");}
void  S3310C1 ::v2(){vfunc_called(this, "_ZN7S3310C12v2Ev");}
void  S3310C1 ::v3(){vfunc_called(this, "_ZN7S3310C12v3Ev");}
void  S3310C1 ::v4(){vfunc_called(this, "_ZN7S3310C12v4Ev");}
S3310C1 ::~S3310C1(){ note_dtor("S3310C1", this);} // tgen
S3310C1 ::S3310C1(){ note_ctor("S3310C1", this);} // tgen

static void Test_S3310C1()
{
  extern Class_Descriptor cd_S3310C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3310C1, buf);
    S3310C1 *dp, &lv = *(dp=new (buf) S3310C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3310C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3310C1)");
    check_base_class_offset(lv, (S3310C3*)(S3310C2*), 0, "S3310C1");
    check_base_class_offset(lv, (S3310C2*), 0, "S3310C1");
    test_class_info(&lv, &cd_S3310C1);
    dp->~S3310C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3310C1(Test_S3310C1, "S3310C1", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3310C1C1Ev();
extern void _ZN7S3310C1D1Ev();
Name_Map name_map_S3310C1[] = {
  NSPAIR(_ZN7S3310C1C1Ev),
  NSPAIR(_ZN7S3310C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3310C3;
extern VTBL_ENTRY _ZTI7S3310C3[];
extern  VTBL_ENTRY _ZTV7S3310C3[];
extern Class_Descriptor cd_S3310C2;
extern VTBL_ENTRY _ZTI7S3310C2[];
extern  VTBL_ENTRY _ZTV7S3310C2[];
static Base_Class bases_S3310C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3310C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3310C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3310C1[];
extern void _ZN7S3310C1D1Ev();
extern void _ZN7S3310C1D0Ev();
extern void _ZN7S3310C32v5Ev();
extern void _ZN7S3310C32v6Ev();
extern void _ZN7S3310C32v7Ev();
extern void _ZN7S3310C32v8Ev();
extern void _ZN7S3310C32v9Ev();
extern void _ZN7S3310C33v10Ev();
extern void _ZN7S3310C33v11Ev();
extern void _ZN7S3310C33v12Ev();
extern void _ZN7S3310C33v13Ev();
extern void _ZN7S3310C33v14Ev();
extern void _ZN7S3310C23v15Ev();
extern void _ZN7S3310C23v16Ev();
extern void _ZN7S3310C23v17Ev();
extern void _ZN7S3310C23v18Ev();
extern void _ZN7S3310C23v19Ev();
extern void _ZN7S3310C12v1Ev();
extern void _ZN7S3310C12v2Ev();
extern void _ZN7S3310C12v3Ev();
extern void _ZN7S3310C12v4Ev();
static  VTBL_ENTRY vtc_S3310C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3310C1[0]),
  (VTBL_ENTRY)&_ZN7S3310C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3310C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3310C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3310C33v14Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3310C23v19Ev,
  (VTBL_ENTRY)&_ZN7S3310C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3310C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3310C12v3Ev,
  (VTBL_ENTRY)&_ZN7S3310C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S3310C1[];
extern  VTBL_ENTRY _ZTV7S3310C1[];
Class_Descriptor cd_S3310C1 = {  "S3310C1", // class name
  bases_S3310C1, 2,
  &(vtc_S3310C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3310C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3310C1),23, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3261C3  {
  void *s3261c3f0[2];
  ::S10103C13_nt s3261c3f1;
  void *s3261c3f2;
  virtual  ~S3261C3(); // _ZN7S3261C3D1Ev
  virtual void  v4(); // _ZN7S3261C32v4Ev
  virtual void  v5(); // _ZN7S3261C32v5Ev
  virtual void  v6(); // _ZN7S3261C32v6Ev
  virtual void  v7(); // _ZN7S3261C32v7Ev
  virtual void  v8(); // _ZN7S3261C32v8Ev
  virtual void  v9(); // _ZN7S3261C32v9Ev
  virtual void  v10(); // _ZN7S3261C33v10Ev
  virtual void  v11(); // _ZN7S3261C33v11Ev
  virtual void  v12(); // _ZN7S3261C33v12Ev
  virtual void  v13(); // _ZN7S3261C33v13Ev
  S3261C3(); // tgen
};
//SIG(-1 S3261C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3261C3 ::~S3261C3(){ note_dtor("S3261C3", this);}
void  S3261C3 ::v4(){vfunc_called(this, "_ZN7S3261C32v4Ev");}
void  S3261C3 ::v5(){vfunc_called(this, "_ZN7S3261C32v5Ev");}
void  S3261C3 ::v6(){vfunc_called(this, "_ZN7S3261C32v6Ev");}
void  S3261C3 ::v7(){vfunc_called(this, "_ZN7S3261C32v7Ev");}
void  S3261C3 ::v8(){vfunc_called(this, "_ZN7S3261C32v8Ev");}
void  S3261C3 ::v9(){vfunc_called(this, "_ZN7S3261C32v9Ev");}
void  S3261C3 ::v10(){vfunc_called(this, "_ZN7S3261C33v10Ev");}
void  S3261C3 ::v11(){vfunc_called(this, "_ZN7S3261C33v11Ev");}
void  S3261C3 ::v12(){vfunc_called(this, "_ZN7S3261C33v12Ev");}
void  S3261C3 ::v13(){vfunc_called(this, "_ZN7S3261C33v13Ev");}
S3261C3 ::S3261C3(){ note_ctor("S3261C3", this);} // tgen

static void Test_S3261C3()
{
  extern Class_Descriptor cd_S3261C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3261C3, buf);
    S3261C3 *dp, &lv = *(dp=new (buf) S3261C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3261C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3261C3)");
    check_field_offset(lv, s3261c3f0, ABISELECT(8,4), "S3261C3.s3261c3f0");
    check_field_offset(lv, s3261c3f1, ABISELECT(24,12), "S3261C3.s3261c3f1");
    check_field_offset(lv, s3261c3f2, ABISELECT(48,28), "S3261C3.s3261c3f2");
    test_class_info(&lv, &cd_S3261C3);
    dp->~S3261C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3261C3(Test_S3261C3, "S3261C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3261C3C1Ev();
extern void _ZN7S3261C3D1Ev();
Name_Map name_map_S3261C3[] = {
  NSPAIR(_ZN7S3261C3C1Ev),
  NSPAIR(_ZN7S3261C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3261C3[];
extern void _ZN7S3261C3D1Ev();
extern void _ZN7S3261C3D0Ev();
extern void _ZN7S3261C32v4Ev();
extern void _ZN7S3261C32v5Ev();
extern void _ZN7S3261C32v6Ev();
extern void _ZN7S3261C32v7Ev();
extern void _ZN7S3261C32v8Ev();
extern void _ZN7S3261C32v9Ev();
extern void _ZN7S3261C33v10Ev();
extern void _ZN7S3261C33v11Ev();
extern void _ZN7S3261C33v12Ev();
extern void _ZN7S3261C33v13Ev();
static  VTBL_ENTRY vtc_S3261C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3261C3[0]),
  (VTBL_ENTRY)&_ZN7S3261C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3261C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v13Ev,
};
extern VTBL_ENTRY _ZTI7S3261C3[];
extern  VTBL_ENTRY _ZTV7S3261C3[];
Class_Descriptor cd_S3261C3 = {  "S3261C3", // class name
  0,0,//no base classes
  &(vtc_S3261C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3261C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3261C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3261C2  : S3261C3 {
  void *s3261c2f0;
  ::S10103C13_nt s3261c2f1;
  ::S10103C13_nt s3261c2f2;
  ::S10103C13_nt s3261c2f3;
  ::S10103C86 s3261c2f4;
  ::S10103C86 s3261c2f5;
  ::S10103C86 s3261c2f6;
  virtual  ~S3261C2(); // _ZN7S3261C2D1Ev
  virtual void  v14(); // _ZN7S3261C23v14Ev
  virtual void  v15(); // _ZN7S3261C23v15Ev
  virtual void  v16(); // _ZN7S3261C23v16Ev
  virtual void  v17(); // _ZN7S3261C23v17Ev
  virtual void  v18(); // _ZN7S3261C23v18Ev
  S3261C2(); // tgen
};
//SIG(-1 S3261C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3261C2 ::~S3261C2(){ note_dtor("S3261C2", this);}
void  S3261C2 ::v14(){vfunc_called(this, "_ZN7S3261C23v14Ev");}
void  S3261C2 ::v15(){vfunc_called(this, "_ZN7S3261C23v15Ev");}
void  S3261C2 ::v16(){vfunc_called(this, "_ZN7S3261C23v16Ev");}
void  S3261C2 ::v17(){vfunc_called(this, "_ZN7S3261C23v17Ev");}
void  S3261C2 ::v18(){vfunc_called(this, "_ZN7S3261C23v18Ev");}
S3261C2 ::S3261C2(){ note_ctor("S3261C2", this);} // tgen

static void Test_S3261C2()
{
  extern Class_Descriptor cd_S3261C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3261C2, buf);
    S3261C2 *dp, &lv = *(dp=new (buf) S3261C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3261C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3261C2)");
    check_base_class_offset(lv, (S3261C3*), 0, "S3261C2");
    check_field_offset(lv, s3261c2f0, ABISELECT(56,32), "S3261C2.s3261c2f0");
    check_field_offset(lv, s3261c2f1, ABISELECT(64,36), "S3261C2.s3261c2f1");
    check_field_offset(lv, s3261c2f2, ABISELECT(88,52), "S3261C2.s3261c2f2");
    check_field_offset(lv, s3261c2f3, ABISELECT(112,68), "S3261C2.s3261c2f3");
    check_field_offset(lv, s3261c2f4, ABISELECT(136,84), "S3261C2.s3261c2f4");
    check_field_offset(lv, s3261c2f5, ABISELECT(152,96), "S3261C2.s3261c2f5");
    check_field_offset(lv, s3261c2f6, ABISELECT(168,108), "S3261C2.s3261c2f6");
    test_class_info(&lv, &cd_S3261C2);
    dp->~S3261C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3261C2(Test_S3261C2, "S3261C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3261C2C1Ev();
extern void _ZN7S3261C2D1Ev();
Name_Map name_map_S3261C2[] = {
  NSPAIR(_ZN7S3261C2C1Ev),
  NSPAIR(_ZN7S3261C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3261C3;
extern VTBL_ENTRY _ZTI7S3261C3[];
extern  VTBL_ENTRY _ZTV7S3261C3[];
static Base_Class bases_S3261C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3261C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3261C2[];
extern void _ZN7S3261C2D1Ev();
extern void _ZN7S3261C2D0Ev();
extern void _ZN7S3261C32v4Ev();
extern void _ZN7S3261C32v5Ev();
extern void _ZN7S3261C32v6Ev();
extern void _ZN7S3261C32v7Ev();
extern void _ZN7S3261C32v8Ev();
extern void _ZN7S3261C32v9Ev();
extern void _ZN7S3261C33v10Ev();
extern void _ZN7S3261C33v11Ev();
extern void _ZN7S3261C33v12Ev();
extern void _ZN7S3261C33v13Ev();
extern void _ZN7S3261C23v14Ev();
extern void _ZN7S3261C23v15Ev();
extern void _ZN7S3261C23v16Ev();
extern void _ZN7S3261C23v17Ev();
extern void _ZN7S3261C23v18Ev();
static  VTBL_ENTRY vtc_S3261C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3261C2[0]),
  (VTBL_ENTRY)&_ZN7S3261C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3261C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v18Ev,
};
extern VTBL_ENTRY _ZTI7S3261C2[];
extern  VTBL_ENTRY _ZTV7S3261C2[];
Class_Descriptor cd_S3261C2 = {  "S3261C2", // class name
  bases_S3261C2, 1,
  &(vtc_S3261C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3261C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3261C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3261C1  : S3261C2 {
  virtual  ~S3261C1(); // _ZN7S3261C1D1Ev
  virtual void  v1(); // _ZN7S3261C12v1Ev
  virtual void  v2(); // _ZN7S3261C12v2Ev
  virtual void  v3(); // _ZN7S3261C12v3Ev
  S3261C1(); // tgen
};
//SIG(1 S3261C1) C1{ BC2{ BC3{ vd v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v14 v15 v16 v17 v18 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1 v2 v3}


 S3261C1 ::~S3261C1(){ note_dtor("S3261C1", this);}
void  S3261C1 ::v1(){vfunc_called(this, "_ZN7S3261C12v1Ev");}
void  S3261C1 ::v2(){vfunc_called(this, "_ZN7S3261C12v2Ev");}
void  S3261C1 ::v3(){vfunc_called(this, "_ZN7S3261C12v3Ev");}
S3261C1 ::S3261C1(){ note_ctor("S3261C1", this);} // tgen

static void Test_S3261C1()
{
  extern Class_Descriptor cd_S3261C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3261C1, buf);
    S3261C1 *dp, &lv = *(dp=new (buf) S3261C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3261C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3261C1)");
    check_base_class_offset(lv, (S3261C3*)(S3261C2*), 0, "S3261C1");
    check_base_class_offset(lv, (S3261C2*), 0, "S3261C1");
    test_class_info(&lv, &cd_S3261C1);
    dp->~S3261C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3261C1(Test_S3261C1, "S3261C1", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3261C1C1Ev();
extern void _ZN7S3261C1D1Ev();
Name_Map name_map_S3261C1[] = {
  NSPAIR(_ZN7S3261C1C1Ev),
  NSPAIR(_ZN7S3261C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3261C3;
extern VTBL_ENTRY _ZTI7S3261C3[];
extern  VTBL_ENTRY _ZTV7S3261C3[];
extern Class_Descriptor cd_S3261C2;
extern VTBL_ENTRY _ZTI7S3261C2[];
extern  VTBL_ENTRY _ZTV7S3261C2[];
static Base_Class bases_S3261C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3261C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3261C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3261C1[];
extern void _ZN7S3261C1D1Ev();
extern void _ZN7S3261C1D0Ev();
extern void _ZN7S3261C32v4Ev();
extern void _ZN7S3261C32v5Ev();
extern void _ZN7S3261C32v6Ev();
extern void _ZN7S3261C32v7Ev();
extern void _ZN7S3261C32v8Ev();
extern void _ZN7S3261C32v9Ev();
extern void _ZN7S3261C33v10Ev();
extern void _ZN7S3261C33v11Ev();
extern void _ZN7S3261C33v12Ev();
extern void _ZN7S3261C33v13Ev();
extern void _ZN7S3261C23v14Ev();
extern void _ZN7S3261C23v15Ev();
extern void _ZN7S3261C23v16Ev();
extern void _ZN7S3261C23v17Ev();
extern void _ZN7S3261C23v18Ev();
extern void _ZN7S3261C12v1Ev();
extern void _ZN7S3261C12v2Ev();
extern void _ZN7S3261C12v3Ev();
static  VTBL_ENTRY vtc_S3261C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3261C1[0]),
  (VTBL_ENTRY)&_ZN7S3261C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3261C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3261C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v12Ev,
  (VTBL_ENTRY)&_ZN7S3261C33v13Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3261C23v18Ev,
  (VTBL_ENTRY)&_ZN7S3261C12v1Ev,
  (VTBL_ENTRY)&_ZN7S3261C12v2Ev,
  (VTBL_ENTRY)&_ZN7S3261C12v3Ev,
};
extern VTBL_ENTRY _ZTI7S3261C1[];
extern  VTBL_ENTRY _ZTV7S3261C1[];
Class_Descriptor cd_S3261C1 = {  "S3261C1", // class name
  bases_S3261C1, 2,
  &(vtc_S3261C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3261C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3261C1),22, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3090C3  {
  void *s3090c3f0[2];
  ::S10103C13_nt s3090c3f1;
  void *s3090c3f2;
  virtual  ~S3090C3(); // _ZN7S3090C3D1Ev
  virtual void  v2(); // _ZN7S3090C32v2Ev
  virtual void  v3(); // _ZN7S3090C32v3Ev
  virtual void  v4(); // _ZN7S3090C32v4Ev
  virtual void  v5(); // _ZN7S3090C32v5Ev
  virtual void  v6(); // _ZN7S3090C32v6Ev
  virtual void  v7(); // _ZN7S3090C32v7Ev
  virtual void  v8(); // _ZN7S3090C32v8Ev
  virtual void  v9(); // _ZN7S3090C32v9Ev
  virtual void  v10(); // _ZN7S3090C33v10Ev
  virtual void  v11(); // _ZN7S3090C33v11Ev
  S3090C3(); // tgen
};
//SIG(-1 S3090C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3090C3 ::~S3090C3(){ note_dtor("S3090C3", this);}
void  S3090C3 ::v2(){vfunc_called(this, "_ZN7S3090C32v2Ev");}
void  S3090C3 ::v3(){vfunc_called(this, "_ZN7S3090C32v3Ev");}
void  S3090C3 ::v4(){vfunc_called(this, "_ZN7S3090C32v4Ev");}
void  S3090C3 ::v5(){vfunc_called(this, "_ZN7S3090C32v5Ev");}
void  S3090C3 ::v6(){vfunc_called(this, "_ZN7S3090C32v6Ev");}
void  S3090C3 ::v7(){vfunc_called(this, "_ZN7S3090C32v7Ev");}
void  S3090C3 ::v8(){vfunc_called(this, "_ZN7S3090C32v8Ev");}
void  S3090C3 ::v9(){vfunc_called(this, "_ZN7S3090C32v9Ev");}
void  S3090C3 ::v10(){vfunc_called(this, "_ZN7S3090C33v10Ev");}
void  S3090C3 ::v11(){vfunc_called(this, "_ZN7S3090C33v11Ev");}
S3090C3 ::S3090C3(){ note_ctor("S3090C3", this);} // tgen

static void Test_S3090C3()
{
  extern Class_Descriptor cd_S3090C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3090C3, buf);
    S3090C3 *dp, &lv = *(dp=new (buf) S3090C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3090C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3090C3)");
    check_field_offset(lv, s3090c3f0, ABISELECT(8,4), "S3090C3.s3090c3f0");
    check_field_offset(lv, s3090c3f1, ABISELECT(24,12), "S3090C3.s3090c3f1");
    check_field_offset(lv, s3090c3f2, ABISELECT(48,28), "S3090C3.s3090c3f2");
    test_class_info(&lv, &cd_S3090C3);
    dp->~S3090C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3090C3(Test_S3090C3, "S3090C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3090C3C1Ev();
extern void _ZN7S3090C3D1Ev();
Name_Map name_map_S3090C3[] = {
  NSPAIR(_ZN7S3090C3C1Ev),
  NSPAIR(_ZN7S3090C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3090C3[];
extern void _ZN7S3090C3D1Ev();
extern void _ZN7S3090C3D0Ev();
extern void _ZN7S3090C32v2Ev();
extern void _ZN7S3090C32v3Ev();
extern void _ZN7S3090C32v4Ev();
extern void _ZN7S3090C32v5Ev();
extern void _ZN7S3090C32v6Ev();
extern void _ZN7S3090C32v7Ev();
extern void _ZN7S3090C32v8Ev();
extern void _ZN7S3090C32v9Ev();
extern void _ZN7S3090C33v10Ev();
extern void _ZN7S3090C33v11Ev();
static  VTBL_ENTRY vtc_S3090C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3090C3[0]),
  (VTBL_ENTRY)&_ZN7S3090C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3090C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3090C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3090C33v11Ev,
};
extern VTBL_ENTRY _ZTI7S3090C3[];
extern  VTBL_ENTRY _ZTV7S3090C3[];
Class_Descriptor cd_S3090C3 = {  "S3090C3", // class name
  0,0,//no base classes
  &(vtc_S3090C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3090C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3090C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3090C2  : S3090C3 {
  void *s3090c2f0[2];
  ::S10103C82_nt s3090c2f1;
  ::S10103C82_nt s3090c2f2;
  ::S10103C82_nt s3090c2f3;
  int s3090c2f4[13];
  void *s3090c2f5[3];
  int s3090c2f6[3];
  virtual  ~S3090C2(); // _ZN7S3090C2D1Ev
  virtual void  v12(); // _ZN7S3090C23v12Ev
  virtual void  v13(); // _ZN7S3090C23v13Ev
  virtual void  v14(); // _ZN7S3090C23v14Ev
  virtual void  v15(); // _ZN7S3090C23v15Ev
  virtual void  v16(); // _ZN7S3090C23v16Ev
  virtual void  v17(); // _ZN7S3090C23v17Ev
  S3090C2(); // tgen
};
//SIG(-1 S3090C2) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp[2] FC6{ m FC7{ m FL[2]}} FC6 FC6 Fi[13] Fp[3] Fi[3]}


 S3090C2 ::~S3090C2(){ note_dtor("S3090C2", this);}
void  S3090C2 ::v12(){vfunc_called(this, "_ZN7S3090C23v12Ev");}
void  S3090C2 ::v13(){vfunc_called(this, "_ZN7S3090C23v13Ev");}
void  S3090C2 ::v14(){vfunc_called(this, "_ZN7S3090C23v14Ev");}
void  S3090C2 ::v15(){vfunc_called(this, "_ZN7S3090C23v15Ev");}
void  S3090C2 ::v16(){vfunc_called(this, "_ZN7S3090C23v16Ev");}
void  S3090C2 ::v17(){vfunc_called(this, "_ZN7S3090C23v17Ev");}
S3090C2 ::S3090C2(){ note_ctor("S3090C2", this);} // tgen

static void Test_S3090C2()
{
  extern Class_Descriptor cd_S3090C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,42)];
    init_test(&cd_S3090C2, buf);
    S3090C2 *dp, &lv = *(dp=new (buf) S3090C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,164), "sizeof(S3090C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3090C2)");
    check_base_class_offset(lv, (S3090C3*), 0, "S3090C2");
    check_field_offset(lv, s3090c2f0, ABISELECT(56,32), "S3090C2.s3090c2f0");
    check_field_offset(lv, s3090c2f1, ABISELECT(72,40), "S3090C2.s3090c2f1");
    check_field_offset(lv, s3090c2f2, ABISELECT(88,56), "S3090C2.s3090c2f2");
    check_field_offset(lv, s3090c2f3, ABISELECT(104,72), "S3090C2.s3090c2f3");
    check_field_offset(lv, s3090c2f4, ABISELECT(120,88), "S3090C2.s3090c2f4");
    check_field_offset(lv, s3090c2f5, ABISELECT(176,140), "S3090C2.s3090c2f5");
    check_field_offset(lv, s3090c2f6, ABISELECT(200,152), "S3090C2.s3090c2f6");
    test_class_info(&lv, &cd_S3090C2);
    dp->~S3090C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3090C2(Test_S3090C2, "S3090C2", ABISELECT(216,164));

#else // __cplusplus

extern void _ZN7S3090C2C1Ev();
extern void _ZN7S3090C2D1Ev();
Name_Map name_map_S3090C2[] = {
  NSPAIR(_ZN7S3090C2C1Ev),
  NSPAIR(_ZN7S3090C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3090C3;
extern VTBL_ENTRY _ZTI7S3090C3[];
extern  VTBL_ENTRY _ZTV7S3090C3[];
static Base_Class bases_S3090C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3090C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3090C2[];
extern void _ZN7S3090C2D1Ev();
extern void _ZN7S3090C2D0Ev();
extern void _ZN7S3090C32v2Ev();
extern void _ZN7S3090C32v3Ev();
extern void _ZN7S3090C32v4Ev();
extern void _ZN7S3090C32v5Ev();
extern void _ZN7S3090C32v6Ev();
extern void _ZN7S3090C32v7Ev();
extern void _ZN7S3090C32v8Ev();
extern void _ZN7S3090C32v9Ev();
extern void _ZN7S3090C33v10Ev();
extern void _ZN7S3090C33v11Ev();
extern void _ZN7S3090C23v12Ev();
extern void _ZN7S3090C23v13Ev();
extern void _ZN7S3090C23v14Ev();
extern void _ZN7S3090C23v15Ev();
extern void _ZN7S3090C23v16Ev();
extern void _ZN7S3090C23v17Ev();
static  VTBL_ENTRY vtc_S3090C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3090C2[0]),
  (VTBL_ENTRY)&_ZN7S3090C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3090C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3090C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3090C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v17Ev,
};
extern VTBL_ENTRY _ZTI7S3090C2[];
extern  VTBL_ENTRY _ZTV7S3090C2[];
Class_Descriptor cd_S3090C2 = {  "S3090C2", // class name
  bases_S3090C2, 1,
  &(vtc_S3090C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,164), // object size
  NSPAIRA(_ZTI7S3090C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3090C2),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3090C1  : S3090C2 {
  virtual  ~S3090C1(); // _ZN7S3090C1D1Ev
  virtual void  v1(); // _ZN7S3090C12v1Ev
  S3090C1(); // tgen
};
//SIG(1 S3090C1) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 Fp[2] FC7{ m FC8{ m FL[2]}} FC7 FC7 Fi[13] Fp[3] Fi[3]} vd v1}


 S3090C1 ::~S3090C1(){ note_dtor("S3090C1", this);}
void  S3090C1 ::v1(){vfunc_called(this, "_ZN7S3090C12v1Ev");}
S3090C1 ::S3090C1(){ note_ctor("S3090C1", this);} // tgen

static void Test_S3090C1()
{
  extern Class_Descriptor cd_S3090C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,42)];
    init_test(&cd_S3090C1, buf);
    S3090C1 *dp, &lv = *(dp=new (buf) S3090C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,164), "sizeof(S3090C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3090C1)");
    check_base_class_offset(lv, (S3090C3*)(S3090C2*), 0, "S3090C1");
    check_base_class_offset(lv, (S3090C2*), 0, "S3090C1");
    test_class_info(&lv, &cd_S3090C1);
    dp->~S3090C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3090C1(Test_S3090C1, "S3090C1", ABISELECT(216,164));

#else // __cplusplus

extern void _ZN7S3090C1C1Ev();
extern void _ZN7S3090C1D1Ev();
Name_Map name_map_S3090C1[] = {
  NSPAIR(_ZN7S3090C1C1Ev),
  NSPAIR(_ZN7S3090C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3090C3;
extern VTBL_ENTRY _ZTI7S3090C3[];
extern  VTBL_ENTRY _ZTV7S3090C3[];
extern Class_Descriptor cd_S3090C2;
extern VTBL_ENTRY _ZTI7S3090C2[];
extern  VTBL_ENTRY _ZTV7S3090C2[];
static Base_Class bases_S3090C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3090C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3090C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3090C1[];
extern void _ZN7S3090C1D1Ev();
extern void _ZN7S3090C1D0Ev();
extern void _ZN7S3090C32v2Ev();
extern void _ZN7S3090C32v3Ev();
extern void _ZN7S3090C32v4Ev();
extern void _ZN7S3090C32v5Ev();
extern void _ZN7S3090C32v6Ev();
extern void _ZN7S3090C32v7Ev();
extern void _ZN7S3090C32v8Ev();
extern void _ZN7S3090C32v9Ev();
extern void _ZN7S3090C33v10Ev();
extern void _ZN7S3090C33v11Ev();
extern void _ZN7S3090C23v12Ev();
extern void _ZN7S3090C23v13Ev();
extern void _ZN7S3090C23v14Ev();
extern void _ZN7S3090C23v15Ev();
extern void _ZN7S3090C23v16Ev();
extern void _ZN7S3090C23v17Ev();
extern void _ZN7S3090C12v1Ev();
static  VTBL_ENTRY vtc_S3090C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3090C1[0]),
  (VTBL_ENTRY)&_ZN7S3090C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3090C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3090C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3090C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3090C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3090C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3090C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S3090C1[];
extern  VTBL_ENTRY _ZTV7S3090C1[];
Class_Descriptor cd_S3090C1 = {  "S3090C1", // class name
  bases_S3090C1, 2,
  &(vtc_S3090C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,164), // object size
  NSPAIRA(_ZTI7S3090C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3090C1),21, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3091C3  {
  void *s3091c3f0[2];
  ::S10103C13_nt s3091c3f1;
  void *s3091c3f2;
  virtual  ~S3091C3(); // _ZN7S3091C3D1Ev
  virtual void  v2(); // _ZN7S3091C32v2Ev
  virtual void  v3(); // _ZN7S3091C32v3Ev
  virtual void  v4(); // _ZN7S3091C32v4Ev
  virtual void  v5(); // _ZN7S3091C32v5Ev
  virtual void  v6(); // _ZN7S3091C32v6Ev
  virtual void  v7(); // _ZN7S3091C32v7Ev
  virtual void  v8(); // _ZN7S3091C32v8Ev
  virtual void  v9(); // _ZN7S3091C32v9Ev
  virtual void  v10(); // _ZN7S3091C33v10Ev
  virtual void  v11(); // _ZN7S3091C33v11Ev
  S3091C3(); // tgen
};
//SIG(-1 S3091C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3091C3 ::~S3091C3(){ note_dtor("S3091C3", this);}
void  S3091C3 ::v2(){vfunc_called(this, "_ZN7S3091C32v2Ev");}
void  S3091C3 ::v3(){vfunc_called(this, "_ZN7S3091C32v3Ev");}
void  S3091C3 ::v4(){vfunc_called(this, "_ZN7S3091C32v4Ev");}
void  S3091C3 ::v5(){vfunc_called(this, "_ZN7S3091C32v5Ev");}
void  S3091C3 ::v6(){vfunc_called(this, "_ZN7S3091C32v6Ev");}
void  S3091C3 ::v7(){vfunc_called(this, "_ZN7S3091C32v7Ev");}
void  S3091C3 ::v8(){vfunc_called(this, "_ZN7S3091C32v8Ev");}
void  S3091C3 ::v9(){vfunc_called(this, "_ZN7S3091C32v9Ev");}
void  S3091C3 ::v10(){vfunc_called(this, "_ZN7S3091C33v10Ev");}
void  S3091C3 ::v11(){vfunc_called(this, "_ZN7S3091C33v11Ev");}
S3091C3 ::S3091C3(){ note_ctor("S3091C3", this);} // tgen

static void Test_S3091C3()
{
  extern Class_Descriptor cd_S3091C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3091C3, buf);
    S3091C3 *dp, &lv = *(dp=new (buf) S3091C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3091C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3091C3)");
    check_field_offset(lv, s3091c3f0, ABISELECT(8,4), "S3091C3.s3091c3f0");
    check_field_offset(lv, s3091c3f1, ABISELECT(24,12), "S3091C3.s3091c3f1");
    check_field_offset(lv, s3091c3f2, ABISELECT(48,28), "S3091C3.s3091c3f2");
    test_class_info(&lv, &cd_S3091C3);
    dp->~S3091C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3091C3(Test_S3091C3, "S3091C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3091C3C1Ev();
extern void _ZN7S3091C3D1Ev();
Name_Map name_map_S3091C3[] = {
  NSPAIR(_ZN7S3091C3C1Ev),
  NSPAIR(_ZN7S3091C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3091C3[];
extern void _ZN7S3091C3D1Ev();
extern void _ZN7S3091C3D0Ev();
extern void _ZN7S3091C32v2Ev();
extern void _ZN7S3091C32v3Ev();
extern void _ZN7S3091C32v4Ev();
extern void _ZN7S3091C32v5Ev();
extern void _ZN7S3091C32v6Ev();
extern void _ZN7S3091C32v7Ev();
extern void _ZN7S3091C32v8Ev();
extern void _ZN7S3091C32v9Ev();
extern void _ZN7S3091C33v10Ev();
extern void _ZN7S3091C33v11Ev();
static  VTBL_ENTRY vtc_S3091C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3091C3[0]),
  (VTBL_ENTRY)&_ZN7S3091C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3091C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3091C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3091C33v11Ev,
};
extern VTBL_ENTRY _ZTI7S3091C3[];
extern  VTBL_ENTRY _ZTV7S3091C3[];
Class_Descriptor cd_S3091C3 = {  "S3091C3", // class name
  0,0,//no base classes
  &(vtc_S3091C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3091C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3091C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3091C2  : S3091C3 {
  void *s3091c2f0[2];
  ::S10103C82_nt s3091c2f1;
  ::S10103C82_nt s3091c2f2;
  ::S10103C82_nt s3091c2f3;
  int s3091c2f4[13];
  void *s3091c2f5[3];
  int s3091c2f6[3];
  virtual  ~S3091C2(); // _ZN7S3091C2D1Ev
  virtual void  v12(); // _ZN7S3091C23v12Ev
  virtual void  v13(); // _ZN7S3091C23v13Ev
  virtual void  v14(); // _ZN7S3091C23v14Ev
  virtual void  v15(); // _ZN7S3091C23v15Ev
  virtual void  v16(); // _ZN7S3091C23v16Ev
  virtual void  v17(); // _ZN7S3091C23v17Ev
  S3091C2(); // tgen
};
//SIG(-1 S3091C2) C1{ BC2{ vd v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 v6 Fp[2] FC6{ m FC7{ m FL[2]}} FC6 FC6 Fi[13] Fp[3] Fi[3]}


 S3091C2 ::~S3091C2(){ note_dtor("S3091C2", this);}
void  S3091C2 ::v12(){vfunc_called(this, "_ZN7S3091C23v12Ev");}
void  S3091C2 ::v13(){vfunc_called(this, "_ZN7S3091C23v13Ev");}
void  S3091C2 ::v14(){vfunc_called(this, "_ZN7S3091C23v14Ev");}
void  S3091C2 ::v15(){vfunc_called(this, "_ZN7S3091C23v15Ev");}
void  S3091C2 ::v16(){vfunc_called(this, "_ZN7S3091C23v16Ev");}
void  S3091C2 ::v17(){vfunc_called(this, "_ZN7S3091C23v17Ev");}
S3091C2 ::S3091C2(){ note_ctor("S3091C2", this);} // tgen

static void Test_S3091C2()
{
  extern Class_Descriptor cd_S3091C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,42)];
    init_test(&cd_S3091C2, buf);
    S3091C2 *dp, &lv = *(dp=new (buf) S3091C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,164), "sizeof(S3091C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3091C2)");
    check_base_class_offset(lv, (S3091C3*), 0, "S3091C2");
    check_field_offset(lv, s3091c2f0, ABISELECT(56,32), "S3091C2.s3091c2f0");
    check_field_offset(lv, s3091c2f1, ABISELECT(72,40), "S3091C2.s3091c2f1");
    check_field_offset(lv, s3091c2f2, ABISELECT(88,56), "S3091C2.s3091c2f2");
    check_field_offset(lv, s3091c2f3, ABISELECT(104,72), "S3091C2.s3091c2f3");
    check_field_offset(lv, s3091c2f4, ABISELECT(120,88), "S3091C2.s3091c2f4");
    check_field_offset(lv, s3091c2f5, ABISELECT(176,140), "S3091C2.s3091c2f5");
    check_field_offset(lv, s3091c2f6, ABISELECT(200,152), "S3091C2.s3091c2f6");
    test_class_info(&lv, &cd_S3091C2);
    dp->~S3091C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3091C2(Test_S3091C2, "S3091C2", ABISELECT(216,164));

#else // __cplusplus

extern void _ZN7S3091C2C1Ev();
extern void _ZN7S3091C2D1Ev();
Name_Map name_map_S3091C2[] = {
  NSPAIR(_ZN7S3091C2C1Ev),
  NSPAIR(_ZN7S3091C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3091C3;
extern VTBL_ENTRY _ZTI7S3091C3[];
extern  VTBL_ENTRY _ZTV7S3091C3[];
static Base_Class bases_S3091C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3091C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3091C2[];
extern void _ZN7S3091C2D1Ev();
extern void _ZN7S3091C2D0Ev();
extern void _ZN7S3091C32v2Ev();
extern void _ZN7S3091C32v3Ev();
extern void _ZN7S3091C32v4Ev();
extern void _ZN7S3091C32v5Ev();
extern void _ZN7S3091C32v6Ev();
extern void _ZN7S3091C32v7Ev();
extern void _ZN7S3091C32v8Ev();
extern void _ZN7S3091C32v9Ev();
extern void _ZN7S3091C33v10Ev();
extern void _ZN7S3091C33v11Ev();
extern void _ZN7S3091C23v12Ev();
extern void _ZN7S3091C23v13Ev();
extern void _ZN7S3091C23v14Ev();
extern void _ZN7S3091C23v15Ev();
extern void _ZN7S3091C23v16Ev();
extern void _ZN7S3091C23v17Ev();
static  VTBL_ENTRY vtc_S3091C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3091C2[0]),
  (VTBL_ENTRY)&_ZN7S3091C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3091C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3091C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3091C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v17Ev,
};
extern VTBL_ENTRY _ZTI7S3091C2[];
extern  VTBL_ENTRY _ZTV7S3091C2[];
Class_Descriptor cd_S3091C2 = {  "S3091C2", // class name
  bases_S3091C2, 1,
  &(vtc_S3091C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,164), // object size
  NSPAIRA(_ZTI7S3091C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3091C2),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3091C1  : S3091C2 {
  virtual void  v1(); // _ZN7S3091C12v1Ev
  ~S3091C1(); // tgen
  S3091C1(); // tgen
};
//SIG(1 S3091C1) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 v17 Fp[2] FC7{ m FC8{ m FL[2]}} FC7 FC7 Fi[13] Fp[3] Fi[3]} v1}


void  S3091C1 ::v1(){vfunc_called(this, "_ZN7S3091C12v1Ev");}
S3091C1 ::~S3091C1(){ note_dtor("S3091C1", this);} // tgen
S3091C1 ::S3091C1(){ note_ctor("S3091C1", this);} // tgen

static void Test_S3091C1()
{
  extern Class_Descriptor cd_S3091C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,42)];
    init_test(&cd_S3091C1, buf);
    S3091C1 *dp, &lv = *(dp=new (buf) S3091C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,164), "sizeof(S3091C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3091C1)");
    check_base_class_offset(lv, (S3091C3*)(S3091C2*), 0, "S3091C1");
    check_base_class_offset(lv, (S3091C2*), 0, "S3091C1");
    test_class_info(&lv, &cd_S3091C1);
    dp->~S3091C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3091C1(Test_S3091C1, "S3091C1", ABISELECT(216,164));

#else // __cplusplus

extern void _ZN7S3091C1C1Ev();
extern void _ZN7S3091C1D1Ev();
Name_Map name_map_S3091C1[] = {
  NSPAIR(_ZN7S3091C1C1Ev),
  NSPAIR(_ZN7S3091C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3091C3;
extern VTBL_ENTRY _ZTI7S3091C3[];
extern  VTBL_ENTRY _ZTV7S3091C3[];
extern Class_Descriptor cd_S3091C2;
extern VTBL_ENTRY _ZTI7S3091C2[];
extern  VTBL_ENTRY _ZTV7S3091C2[];
static Base_Class bases_S3091C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3091C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3091C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3091C1[];
extern void _ZN7S3091C1D1Ev();
extern void _ZN7S3091C1D0Ev();
extern void _ZN7S3091C32v2Ev();
extern void _ZN7S3091C32v3Ev();
extern void _ZN7S3091C32v4Ev();
extern void _ZN7S3091C32v5Ev();
extern void _ZN7S3091C32v6Ev();
extern void _ZN7S3091C32v7Ev();
extern void _ZN7S3091C32v8Ev();
extern void _ZN7S3091C32v9Ev();
extern void _ZN7S3091C33v10Ev();
extern void _ZN7S3091C33v11Ev();
extern void _ZN7S3091C23v12Ev();
extern void _ZN7S3091C23v13Ev();
extern void _ZN7S3091C23v14Ev();
extern void _ZN7S3091C23v15Ev();
extern void _ZN7S3091C23v16Ev();
extern void _ZN7S3091C23v17Ev();
extern void _ZN7S3091C12v1Ev();
static  VTBL_ENTRY vtc_S3091C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3091C1[0]),
  (VTBL_ENTRY)&_ZN7S3091C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3091C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3091C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3091C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3091C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3091C23v17Ev,
  (VTBL_ENTRY)&_ZN7S3091C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S3091C1[];
extern  VTBL_ENTRY _ZTV7S3091C1[];
Class_Descriptor cd_S3091C1 = {  "S3091C1", // class name
  bases_S3091C1, 2,
  &(vtc_S3091C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,164), // object size
  NSPAIRA(_ZTI7S3091C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3091C1),21, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3088C3  {
  void *s3088c3f0[2];
  ::S10103C13_nt s3088c3f1;
  void *s3088c3f2;
  virtual  ~S3088C3(); // _ZN7S3088C3D1Ev
  virtual void  v2(); // _ZN7S3088C32v2Ev
  virtual void  v3(); // _ZN7S3088C32v3Ev
  virtual void  v4(); // _ZN7S3088C32v4Ev
  virtual void  v5(); // _ZN7S3088C32v5Ev
  virtual void  v6(); // _ZN7S3088C32v6Ev
  virtual void  v7(); // _ZN7S3088C32v7Ev
  virtual void  v8(); // _ZN7S3088C32v8Ev
  virtual void  v9(); // _ZN7S3088C32v9Ev
  virtual void  v10(); // _ZN7S3088C33v10Ev
  virtual void  v11(); // _ZN7S3088C33v11Ev
  S3088C3(); // tgen
};
//SIG(-1 S3088C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3088C3 ::~S3088C3(){ note_dtor("S3088C3", this);}
void  S3088C3 ::v2(){vfunc_called(this, "_ZN7S3088C32v2Ev");}
void  S3088C3 ::v3(){vfunc_called(this, "_ZN7S3088C32v3Ev");}
void  S3088C3 ::v4(){vfunc_called(this, "_ZN7S3088C32v4Ev");}
void  S3088C3 ::v5(){vfunc_called(this, "_ZN7S3088C32v5Ev");}
void  S3088C3 ::v6(){vfunc_called(this, "_ZN7S3088C32v6Ev");}
void  S3088C3 ::v7(){vfunc_called(this, "_ZN7S3088C32v7Ev");}
void  S3088C3 ::v8(){vfunc_called(this, "_ZN7S3088C32v8Ev");}
void  S3088C3 ::v9(){vfunc_called(this, "_ZN7S3088C32v9Ev");}
void  S3088C3 ::v10(){vfunc_called(this, "_ZN7S3088C33v10Ev");}
void  S3088C3 ::v11(){vfunc_called(this, "_ZN7S3088C33v11Ev");}
S3088C3 ::S3088C3(){ note_ctor("S3088C3", this);} // tgen

static void Test_S3088C3()
{
  extern Class_Descriptor cd_S3088C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3088C3, buf);
    S3088C3 *dp, &lv = *(dp=new (buf) S3088C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3088C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3088C3)");
    check_field_offset(lv, s3088c3f0, ABISELECT(8,4), "S3088C3.s3088c3f0");
    check_field_offset(lv, s3088c3f1, ABISELECT(24,12), "S3088C3.s3088c3f1");
    check_field_offset(lv, s3088c3f2, ABISELECT(48,28), "S3088C3.s3088c3f2");
    test_class_info(&lv, &cd_S3088C3);
    dp->~S3088C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3088C3(Test_S3088C3, "S3088C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3088C3C1Ev();
extern void _ZN7S3088C3D1Ev();
Name_Map name_map_S3088C3[] = {
  NSPAIR(_ZN7S3088C3C1Ev),
  NSPAIR(_ZN7S3088C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3088C3[];
extern void _ZN7S3088C3D1Ev();
extern void _ZN7S3088C3D0Ev();
extern void _ZN7S3088C32v2Ev();
extern void _ZN7S3088C32v3Ev();
extern void _ZN7S3088C32v4Ev();
extern void _ZN7S3088C32v5Ev();
extern void _ZN7S3088C32v6Ev();
extern void _ZN7S3088C32v7Ev();
extern void _ZN7S3088C32v8Ev();
extern void _ZN7S3088C32v9Ev();
extern void _ZN7S3088C33v10Ev();
extern void _ZN7S3088C33v11Ev();
static  VTBL_ENTRY vtc_S3088C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3088C3[0]),
  (VTBL_ENTRY)&_ZN7S3088C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3088C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3088C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3088C33v11Ev,
};
extern VTBL_ENTRY _ZTI7S3088C3[];
extern  VTBL_ENTRY _ZTV7S3088C3[];
Class_Descriptor cd_S3088C3 = {  "S3088C3", // class name
  0,0,//no base classes
  &(vtc_S3088C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3088C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3088C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3088C2  : S3088C3 {
  void *s3088c2f0;
  ::S10103C13_nt s3088c2f1;
  ::S10103C13_nt s3088c2f2;
  ::S10103C13_nt s3088c2f3;
  ::S10103C86 s3088c2f4;
  ::S10103C86 s3088c2f5;
  ::S10103C86 s3088c2f6;
  virtual  ~S3088C2(); // _ZN7S3088C2D1Ev
  virtual void  v12(); // _ZN7S3088C23v12Ev
  virtual void  v13(); // _ZN7S3088C23v13Ev
  virtual void  v14(); // _ZN7S3088C23v14Ev
  virtual void  v15(); // _ZN7S3088C23v15Ev
  virtual void  v16(); // _ZN7S3088C23v16Ev
  S3088C2(); // tgen
};
//SIG(-1 S3088C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3088C2 ::~S3088C2(){ note_dtor("S3088C2", this);}
void  S3088C2 ::v12(){vfunc_called(this, "_ZN7S3088C23v12Ev");}
void  S3088C2 ::v13(){vfunc_called(this, "_ZN7S3088C23v13Ev");}
void  S3088C2 ::v14(){vfunc_called(this, "_ZN7S3088C23v14Ev");}
void  S3088C2 ::v15(){vfunc_called(this, "_ZN7S3088C23v15Ev");}
void  S3088C2 ::v16(){vfunc_called(this, "_ZN7S3088C23v16Ev");}
S3088C2 ::S3088C2(){ note_ctor("S3088C2", this);} // tgen

static void Test_S3088C2()
{
  extern Class_Descriptor cd_S3088C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3088C2, buf);
    S3088C2 *dp, &lv = *(dp=new (buf) S3088C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3088C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3088C2)");
    check_base_class_offset(lv, (S3088C3*), 0, "S3088C2");
    check_field_offset(lv, s3088c2f0, ABISELECT(56,32), "S3088C2.s3088c2f0");
    check_field_offset(lv, s3088c2f1, ABISELECT(64,36), "S3088C2.s3088c2f1");
    check_field_offset(lv, s3088c2f2, ABISELECT(88,52), "S3088C2.s3088c2f2");
    check_field_offset(lv, s3088c2f3, ABISELECT(112,68), "S3088C2.s3088c2f3");
    check_field_offset(lv, s3088c2f4, ABISELECT(136,84), "S3088C2.s3088c2f4");
    check_field_offset(lv, s3088c2f5, ABISELECT(152,96), "S3088C2.s3088c2f5");
    check_field_offset(lv, s3088c2f6, ABISELECT(168,108), "S3088C2.s3088c2f6");
    test_class_info(&lv, &cd_S3088C2);
    dp->~S3088C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3088C2(Test_S3088C2, "S3088C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3088C2C1Ev();
extern void _ZN7S3088C2D1Ev();
Name_Map name_map_S3088C2[] = {
  NSPAIR(_ZN7S3088C2C1Ev),
  NSPAIR(_ZN7S3088C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3088C3;
extern VTBL_ENTRY _ZTI7S3088C3[];
extern  VTBL_ENTRY _ZTV7S3088C3[];
static Base_Class bases_S3088C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3088C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3088C2[];
extern void _ZN7S3088C2D1Ev();
extern void _ZN7S3088C2D0Ev();
extern void _ZN7S3088C32v2Ev();
extern void _ZN7S3088C32v3Ev();
extern void _ZN7S3088C32v4Ev();
extern void _ZN7S3088C32v5Ev();
extern void _ZN7S3088C32v6Ev();
extern void _ZN7S3088C32v7Ev();
extern void _ZN7S3088C32v8Ev();
extern void _ZN7S3088C32v9Ev();
extern void _ZN7S3088C33v10Ev();
extern void _ZN7S3088C33v11Ev();
extern void _ZN7S3088C23v12Ev();
extern void _ZN7S3088C23v13Ev();
extern void _ZN7S3088C23v14Ev();
extern void _ZN7S3088C23v15Ev();
extern void _ZN7S3088C23v16Ev();
static  VTBL_ENTRY vtc_S3088C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3088C2[0]),
  (VTBL_ENTRY)&_ZN7S3088C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3088C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3088C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3088C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v16Ev,
};
extern VTBL_ENTRY _ZTI7S3088C2[];
extern  VTBL_ENTRY _ZTV7S3088C2[];
Class_Descriptor cd_S3088C2 = {  "S3088C2", // class name
  bases_S3088C2, 1,
  &(vtc_S3088C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3088C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3088C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3088C1  : S3088C2 {
  virtual  ~S3088C1(); // _ZN7S3088C1D1Ev
  virtual void  v1(); // _ZN7S3088C12v1Ev
  S3088C1(); // tgen
};
//SIG(1 S3088C1) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} vd v1}


 S3088C1 ::~S3088C1(){ note_dtor("S3088C1", this);}
void  S3088C1 ::v1(){vfunc_called(this, "_ZN7S3088C12v1Ev");}
S3088C1 ::S3088C1(){ note_ctor("S3088C1", this);} // tgen

static void Test_S3088C1()
{
  extern Class_Descriptor cd_S3088C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3088C1, buf);
    S3088C1 *dp, &lv = *(dp=new (buf) S3088C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3088C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3088C1)");
    check_base_class_offset(lv, (S3088C3*)(S3088C2*), 0, "S3088C1");
    check_base_class_offset(lv, (S3088C2*), 0, "S3088C1");
    test_class_info(&lv, &cd_S3088C1);
    dp->~S3088C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3088C1(Test_S3088C1, "S3088C1", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3088C1C1Ev();
extern void _ZN7S3088C1D1Ev();
Name_Map name_map_S3088C1[] = {
  NSPAIR(_ZN7S3088C1C1Ev),
  NSPAIR(_ZN7S3088C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3088C3;
extern VTBL_ENTRY _ZTI7S3088C3[];
extern  VTBL_ENTRY _ZTV7S3088C3[];
extern Class_Descriptor cd_S3088C2;
extern VTBL_ENTRY _ZTI7S3088C2[];
extern  VTBL_ENTRY _ZTV7S3088C2[];
static Base_Class bases_S3088C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3088C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3088C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3088C1[];
extern void _ZN7S3088C1D1Ev();
extern void _ZN7S3088C1D0Ev();
extern void _ZN7S3088C32v2Ev();
extern void _ZN7S3088C32v3Ev();
extern void _ZN7S3088C32v4Ev();
extern void _ZN7S3088C32v5Ev();
extern void _ZN7S3088C32v6Ev();
extern void _ZN7S3088C32v7Ev();
extern void _ZN7S3088C32v8Ev();
extern void _ZN7S3088C32v9Ev();
extern void _ZN7S3088C33v10Ev();
extern void _ZN7S3088C33v11Ev();
extern void _ZN7S3088C23v12Ev();
extern void _ZN7S3088C23v13Ev();
extern void _ZN7S3088C23v14Ev();
extern void _ZN7S3088C23v15Ev();
extern void _ZN7S3088C23v16Ev();
extern void _ZN7S3088C12v1Ev();
static  VTBL_ENTRY vtc_S3088C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3088C1[0]),
  (VTBL_ENTRY)&_ZN7S3088C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3088C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3088C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3088C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3088C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3088C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3088C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S3088C1[];
extern  VTBL_ENTRY _ZTV7S3088C1[];
Class_Descriptor cd_S3088C1 = {  "S3088C1", // class name
  bases_S3088C1, 2,
  &(vtc_S3088C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3088C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3088C1),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3089C3  {
  void *s3089c3f0[2];
  ::S10103C13_nt s3089c3f1;
  void *s3089c3f2;
  virtual  ~S3089C3(); // _ZN7S3089C3D1Ev
  virtual void  v2(); // _ZN7S3089C32v2Ev
  virtual void  v3(); // _ZN7S3089C32v3Ev
  virtual void  v4(); // _ZN7S3089C32v4Ev
  virtual void  v5(); // _ZN7S3089C32v5Ev
  virtual void  v6(); // _ZN7S3089C32v6Ev
  virtual void  v7(); // _ZN7S3089C32v7Ev
  virtual void  v8(); // _ZN7S3089C32v8Ev
  virtual void  v9(); // _ZN7S3089C32v9Ev
  virtual void  v10(); // _ZN7S3089C33v10Ev
  virtual void  v11(); // _ZN7S3089C33v11Ev
  S3089C3(); // tgen
};
//SIG(-1 S3089C3) C1{ vd v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 Fp[2] FC2{ m FC3{ m Fp Fi FC4{ m}} Fi} Fp}


 S3089C3 ::~S3089C3(){ note_dtor("S3089C3", this);}
void  S3089C3 ::v2(){vfunc_called(this, "_ZN7S3089C32v2Ev");}
void  S3089C3 ::v3(){vfunc_called(this, "_ZN7S3089C32v3Ev");}
void  S3089C3 ::v4(){vfunc_called(this, "_ZN7S3089C32v4Ev");}
void  S3089C3 ::v5(){vfunc_called(this, "_ZN7S3089C32v5Ev");}
void  S3089C3 ::v6(){vfunc_called(this, "_ZN7S3089C32v6Ev");}
void  S3089C3 ::v7(){vfunc_called(this, "_ZN7S3089C32v7Ev");}
void  S3089C3 ::v8(){vfunc_called(this, "_ZN7S3089C32v8Ev");}
void  S3089C3 ::v9(){vfunc_called(this, "_ZN7S3089C32v9Ev");}
void  S3089C3 ::v10(){vfunc_called(this, "_ZN7S3089C33v10Ev");}
void  S3089C3 ::v11(){vfunc_called(this, "_ZN7S3089C33v11Ev");}
S3089C3 ::S3089C3(){ note_ctor("S3089C3", this);} // tgen

static void Test_S3089C3()
{
  extern Class_Descriptor cd_S3089C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_S3089C3, buf);
    S3089C3 *dp, &lv = *(dp=new (buf) S3089C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S3089C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3089C3)");
    check_field_offset(lv, s3089c3f0, ABISELECT(8,4), "S3089C3.s3089c3f0");
    check_field_offset(lv, s3089c3f1, ABISELECT(24,12), "S3089C3.s3089c3f1");
    check_field_offset(lv, s3089c3f2, ABISELECT(48,28), "S3089C3.s3089c3f2");
    test_class_info(&lv, &cd_S3089C3);
    dp->~S3089C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3089C3(Test_S3089C3, "S3089C3", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7S3089C3C1Ev();
extern void _ZN7S3089C3D1Ev();
Name_Map name_map_S3089C3[] = {
  NSPAIR(_ZN7S3089C3C1Ev),
  NSPAIR(_ZN7S3089C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S3089C3[];
extern void _ZN7S3089C3D1Ev();
extern void _ZN7S3089C3D0Ev();
extern void _ZN7S3089C32v2Ev();
extern void _ZN7S3089C32v3Ev();
extern void _ZN7S3089C32v4Ev();
extern void _ZN7S3089C32v5Ev();
extern void _ZN7S3089C32v6Ev();
extern void _ZN7S3089C32v7Ev();
extern void _ZN7S3089C32v8Ev();
extern void _ZN7S3089C32v9Ev();
extern void _ZN7S3089C33v10Ev();
extern void _ZN7S3089C33v11Ev();
static  VTBL_ENTRY vtc_S3089C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3089C3[0]),
  (VTBL_ENTRY)&_ZN7S3089C3D1Ev,
  (VTBL_ENTRY)&_ZN7S3089C3D0Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3089C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3089C33v11Ev,
};
extern VTBL_ENTRY _ZTI7S3089C3[];
extern  VTBL_ENTRY _ZTV7S3089C3[];
Class_Descriptor cd_S3089C3 = {  "S3089C3", // class name
  0,0,//no base classes
  &(vtc_S3089C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7S3089C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S3089C3),14, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3089C2  : S3089C3 {
  void *s3089c2f0;
  ::S10103C13_nt s3089c2f1;
  ::S10103C13_nt s3089c2f2;
  ::S10103C13_nt s3089c2f3;
  ::S10103C86 s3089c2f4;
  ::S10103C86 s3089c2f5;
  ::S10103C86 s3089c2f6;
  virtual  ~S3089C2(); // _ZN7S3089C2D1Ev
  virtual void  v12(); // _ZN7S3089C23v12Ev
  virtual void  v13(); // _ZN7S3089C23v13Ev
  virtual void  v14(); // _ZN7S3089C23v14Ev
  virtual void  v15(); // _ZN7S3089C23v15Ev
  virtual void  v16(); // _ZN7S3089C23v16Ev
  S3089C2(); // tgen
};
//SIG(-1 S3089C2) C1{ BC2{ vd v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 Fp[2] FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} Fp} vd v1 v2 v3 v4 v5 Fp FC3 FC3 FC3 FC6{ m Fp Fi FC7{ m} FC8{ m}} FC6 FC6}


 S3089C2 ::~S3089C2(){ note_dtor("S3089C2", this);}
void  S3089C2 ::v12(){vfunc_called(this, "_ZN7S3089C23v12Ev");}
void  S3089C2 ::v13(){vfunc_called(this, "_ZN7S3089C23v13Ev");}
void  S3089C2 ::v14(){vfunc_called(this, "_ZN7S3089C23v14Ev");}
void  S3089C2 ::v15(){vfunc_called(this, "_ZN7S3089C23v15Ev");}
void  S3089C2 ::v16(){vfunc_called(this, "_ZN7S3089C23v16Ev");}
S3089C2 ::S3089C2(){ note_ctor("S3089C2", this);} // tgen

static void Test_S3089C2()
{
  extern Class_Descriptor cd_S3089C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3089C2, buf);
    S3089C2 *dp, &lv = *(dp=new (buf) S3089C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3089C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3089C2)");
    check_base_class_offset(lv, (S3089C3*), 0, "S3089C2");
    check_field_offset(lv, s3089c2f0, ABISELECT(56,32), "S3089C2.s3089c2f0");
    check_field_offset(lv, s3089c2f1, ABISELECT(64,36), "S3089C2.s3089c2f1");
    check_field_offset(lv, s3089c2f2, ABISELECT(88,52), "S3089C2.s3089c2f2");
    check_field_offset(lv, s3089c2f3, ABISELECT(112,68), "S3089C2.s3089c2f3");
    check_field_offset(lv, s3089c2f4, ABISELECT(136,84), "S3089C2.s3089c2f4");
    check_field_offset(lv, s3089c2f5, ABISELECT(152,96), "S3089C2.s3089c2f5");
    check_field_offset(lv, s3089c2f6, ABISELECT(168,108), "S3089C2.s3089c2f6");
    test_class_info(&lv, &cd_S3089C2);
    dp->~S3089C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3089C2(Test_S3089C2, "S3089C2", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3089C2C1Ev();
extern void _ZN7S3089C2D1Ev();
Name_Map name_map_S3089C2[] = {
  NSPAIR(_ZN7S3089C2C1Ev),
  NSPAIR(_ZN7S3089C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3089C3;
extern VTBL_ENTRY _ZTI7S3089C3[];
extern  VTBL_ENTRY _ZTV7S3089C3[];
static Base_Class bases_S3089C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3089C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3089C2[];
extern void _ZN7S3089C2D1Ev();
extern void _ZN7S3089C2D0Ev();
extern void _ZN7S3089C32v2Ev();
extern void _ZN7S3089C32v3Ev();
extern void _ZN7S3089C32v4Ev();
extern void _ZN7S3089C32v5Ev();
extern void _ZN7S3089C32v6Ev();
extern void _ZN7S3089C32v7Ev();
extern void _ZN7S3089C32v8Ev();
extern void _ZN7S3089C32v9Ev();
extern void _ZN7S3089C33v10Ev();
extern void _ZN7S3089C33v11Ev();
extern void _ZN7S3089C23v12Ev();
extern void _ZN7S3089C23v13Ev();
extern void _ZN7S3089C23v14Ev();
extern void _ZN7S3089C23v15Ev();
extern void _ZN7S3089C23v16Ev();
static  VTBL_ENTRY vtc_S3089C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3089C2[0]),
  (VTBL_ENTRY)&_ZN7S3089C2D1Ev,
  (VTBL_ENTRY)&_ZN7S3089C2D0Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3089C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3089C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v16Ev,
};
extern VTBL_ENTRY _ZTI7S3089C2[];
extern  VTBL_ENTRY _ZTV7S3089C2[];
Class_Descriptor cd_S3089C2 = {  "S3089C2", // class name
  bases_S3089C2, 1,
  &(vtc_S3089C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3089C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3089C2),19, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S3089C1  : S3089C2 {
  virtual void  v1(); // _ZN7S3089C12v1Ev
  ~S3089C1(); // tgen
  S3089C1(); // tgen
};
//SIG(1 S3089C1) C1{ BC2{ BC3{ vd v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 Fp[2] FC4{ m FC5{ m Fp Fi FC6{ m}} Fi} Fp} vd v12 v13 v14 v15 v16 Fp FC4 FC4 FC4 FC7{ m Fp Fi FC8{ m} FC9{ m}} FC7 FC7} v1}


void  S3089C1 ::v1(){vfunc_called(this, "_ZN7S3089C12v1Ev");}
S3089C1 ::~S3089C1(){ note_dtor("S3089C1", this);} // tgen
S3089C1 ::S3089C1(){ note_ctor("S3089C1", this);} // tgen

static void Test_S3089C1()
{
  extern Class_Descriptor cd_S3089C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,31)];
    init_test(&cd_S3089C1, buf);
    S3089C1 *dp, &lv = *(dp=new (buf) S3089C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,120), "sizeof(S3089C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S3089C1)");
    check_base_class_offset(lv, (S3089C3*)(S3089C2*), 0, "S3089C1");
    check_base_class_offset(lv, (S3089C2*), 0, "S3089C1");
    test_class_info(&lv, &cd_S3089C1);
    dp->~S3089C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS3089C1(Test_S3089C1, "S3089C1", ABISELECT(184,120));

#else // __cplusplus

extern void _ZN7S3089C1C1Ev();
extern void _ZN7S3089C1D1Ev();
Name_Map name_map_S3089C1[] = {
  NSPAIR(_ZN7S3089C1C1Ev),
  NSPAIR(_ZN7S3089C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S3089C3;
extern VTBL_ENTRY _ZTI7S3089C3[];
extern  VTBL_ENTRY _ZTV7S3089C3[];
extern Class_Descriptor cd_S3089C2;
extern VTBL_ENTRY _ZTI7S3089C2[];
extern  VTBL_ENTRY _ZTV7S3089C2[];
static Base_Class bases_S3089C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S3089C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S3089C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S3089C1[];
extern void _ZN7S3089C1D1Ev();
extern void _ZN7S3089C1D0Ev();
extern void _ZN7S3089C32v2Ev();
extern void _ZN7S3089C32v3Ev();
extern void _ZN7S3089C32v4Ev();
extern void _ZN7S3089C32v5Ev();
extern void _ZN7S3089C32v6Ev();
extern void _ZN7S3089C32v7Ev();
extern void _ZN7S3089C32v8Ev();
extern void _ZN7S3089C32v9Ev();
extern void _ZN7S3089C33v10Ev();
extern void _ZN7S3089C33v11Ev();
extern void _ZN7S3089C23v12Ev();
extern void _ZN7S3089C23v13Ev();
extern void _ZN7S3089C23v14Ev();
extern void _ZN7S3089C23v15Ev();
extern void _ZN7S3089C23v16Ev();
extern void _ZN7S3089C12v1Ev();
static  VTBL_ENTRY vtc_S3089C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S3089C1[0]),
  (VTBL_ENTRY)&_ZN7S3089C1D1Ev,
  (VTBL_ENTRY)&_ZN7S3089C1D0Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v2Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v3Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v4Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v5Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v6Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v7Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v8Ev,
  (VTBL_ENTRY)&_ZN7S3089C32v9Ev,
  (VTBL_ENTRY)&_ZN7S3089C33v10Ev,
  (VTBL_ENTRY)&_ZN7S3089C33v11Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v12Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v13Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v14Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v15Ev,
  (VTBL_ENTRY)&_ZN7S3089C23v16Ev,
  (VTBL_ENTRY)&_ZN7S3089C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S3089C1[];
extern  VTBL_ENTRY _ZTV7S3089C1[];
Class_Descriptor cd_S3089C1 = {  "S3089C1", // class name
  bases_S3089C1, 2,
  &(vtc_S3089C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,120), // object size
  NSPAIRA(_ZTI7S3089C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S3089C1),20, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4422C3_nt  {
  ::S10103C14_nt s4422c3f0;
  int s4422c3f1[2];
  char s4422c3f2;
  virtual  ~S4422C3_nt(); // _ZN10S4422C3_ntD1Ev
  virtual void  v2(); // _ZN10S4422C3_nt2v2Ev
  virtual void  v3(); // _ZN10S4422C3_nt2v3Ev
  virtual void  v4(); // _ZN10S4422C3_nt2v4Ev
  S4422C3_nt(); // tgen
};
//SIG(-1 S4422C3_nt) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S4422C3_nt ::~S4422C3_nt(){ note_dtor("S4422C3_nt", this);}
void  S4422C3_nt ::v2(){vfunc_called(this, "_ZN10S4422C3_nt2v2Ev");}
void  S4422C3_nt ::v3(){vfunc_called(this, "_ZN10S4422C3_nt2v3Ev");}
void  S4422C3_nt ::v4(){vfunc_called(this, "_ZN10S4422C3_nt2v4Ev");}
S4422C3_nt ::S4422C3_nt(){ note_ctor("S4422C3_nt", this);} // tgen

//skip512 S4422C3_nt

#else // __cplusplus

extern void _ZN10S4422C3_ntC1Ev();
extern void _ZN10S4422C3_ntD1Ev();
Name_Map name_map_S4422C3_nt[] = {
  NSPAIR(_ZN10S4422C3_ntC1Ev),
  NSPAIR(_ZN10S4422C3_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S4422C3_nt[];
extern void _ZN10S4422C3_ntD1Ev();
extern void _ZN10S4422C3_ntD0Ev();
extern void _ZN10S4422C3_nt2v2Ev();
extern void _ZN10S4422C3_nt2v3Ev();
extern void _ZN10S4422C3_nt2v4Ev();
static  VTBL_ENTRY vtc_S4422C3_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S4422C3_nt[0]),
  (VTBL_ENTRY)&_ZN10S4422C3_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_ntD0Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v2Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v3Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v4Ev,
};
extern VTBL_ENTRY _ZTI10S4422C3_nt[];
VTBL_ENTRY *P__ZTI10S4422C3_nt = _ZTI10S4422C3_nt; 
extern  VTBL_ENTRY _ZTV10S4422C3_nt[];
Class_Descriptor cd_S4422C3_nt = {  "S4422C3_nt", // class name
  0,0,//no base classes
  &(vtc_S4422C3_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI10S4422C3_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV10S4422C3_nt),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4422C2  : S4422C3_nt {
  int s4422c2f0[2];
  void *s4422c2f1[2];
  virtual  ~S4422C2(); // _ZN7S4422C2D1Ev
  virtual void  v5(); // _ZN7S4422C22v5Ev
  virtual void  v6(); // _ZN7S4422C22v6Ev
  S4422C2(); // tgen
};
//SIG(-1 S4422C2) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fi[2] Fp[2]}


 S4422C2 ::~S4422C2(){ note_dtor("S4422C2", this);}
void  S4422C2 ::v5(){vfunc_called(this, "_ZN7S4422C22v5Ev");}
void  S4422C2 ::v6(){vfunc_called(this, "_ZN7S4422C22v6Ev");}
S4422C2 ::S4422C2(){ note_ctor("S4422C2", this);} // tgen

static void Test_S4422C2()
{
  extern Class_Descriptor cd_S4422C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_S4422C2, buf);
    S4422C2 *dp, &lv = *(dp=new (buf) S4422C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(S4422C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4422C2)");
    check_base_class_offset(lv, (S4422C3_nt*), 0, "S4422C2");
    check_field_offset(lv, s4422c2f0, ABISELECT(36,28), "S4422C2.s4422c2f0");
    check_field_offset(lv, s4422c2f1, ABISELECT(48,36), "S4422C2.s4422c2f1");
    test_class_info(&lv, &cd_S4422C2);
    dp->~S4422C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4422C2(Test_S4422C2, "S4422C2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7S4422C2C1Ev();
extern void _ZN7S4422C2D1Ev();
Name_Map name_map_S4422C2[] = {
  NSPAIR(_ZN7S4422C2C1Ev),
  NSPAIR(_ZN7S4422C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4422C3_nt;
extern VTBL_ENTRY _ZTI10S4422C3_nt[];
extern  VTBL_ENTRY _ZTV10S4422C3_nt[];
static Base_Class bases_S4422C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4422C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4422C2[];
extern void _ZN7S4422C2D1Ev();
extern void _ZN7S4422C2D0Ev();
extern void _ZN10S4422C3_nt2v2Ev();
extern void _ZN10S4422C3_nt2v3Ev();
extern void _ZN10S4422C3_nt2v4Ev();
extern void _ZN7S4422C22v5Ev();
extern void _ZN7S4422C22v6Ev();
static  VTBL_ENTRY vtc_S4422C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4422C2[0]),
  (VTBL_ENTRY)&_ZN7S4422C2D1Ev,
  (VTBL_ENTRY)&_ZN7S4422C2D0Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v2Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v3Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v4Ev,
  (VTBL_ENTRY)&_ZN7S4422C22v5Ev,
  (VTBL_ENTRY)&_ZN7S4422C22v6Ev,
};
extern VTBL_ENTRY _ZTI7S4422C2[];
extern  VTBL_ENTRY _ZTV7S4422C2[];
Class_Descriptor cd_S4422C2 = {  "S4422C2", // class name
  bases_S4422C2, 1,
  &(vtc_S4422C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7S4422C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4422C2),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4422C1  : S4422C2 {
  ::S10097C31 s4422c1f0;
  void *s4422c1f1[2];
  int s4422c1f2;
  void *s4422c1f3;
  virtual  ~S4422C1(); // _ZN7S4422C1D1Ev
  virtual void  v1(); // _ZN7S4422C12v1Ev
  S4422C1(); // tgen
};
//SIG(1 S4422C1) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} vd v5 v6 Fi[2] Fp[2]} vd v1 FC6{ vd m FC7{ m Fp Fi FC8{ m}} FC7 FC7 FC7 FC7 FL[2] Fi[3]} Fp[2] Fi Fp}


 S4422C1 ::~S4422C1(){ note_dtor("S4422C1", this);}
void  S4422C1 ::v1(){vfunc_called(this, "_ZN7S4422C12v1Ev");}
S4422C1 ::S4422C1(){ note_ctor("S4422C1", this);} // tgen

static void Test_S4422C1()
{
  extern Class_Descriptor cd_S4422C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,39)];
    init_test(&cd_S4422C1, buf);
    S4422C1 *dp, &lv = *(dp=new (buf) S4422C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,152), "sizeof(S4422C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4422C1)");
    check_base_class_offset(lv, (S4422C3_nt*)(S4422C2*), 0, "S4422C1");
    check_base_class_offset(lv, (S4422C2*), 0, "S4422C1");
    check_field_offset(lv, s4422c1f0, ABISELECT(64,44), "S4422C1.s4422c1f0");
    check_field_offset(lv, s4422c1f1, ABISELECT(184,136), "S4422C1.s4422c1f1");
    check_field_offset(lv, s4422c1f2, ABISELECT(200,144), "S4422C1.s4422c1f2");
    check_field_offset(lv, s4422c1f3, ABISELECT(208,148), "S4422C1.s4422c1f3");
    test_class_info(&lv, &cd_S4422C1);
    dp->~S4422C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4422C1(Test_S4422C1, "S4422C1", ABISELECT(216,152));

#else // __cplusplus

extern void _ZN7S4422C1C1Ev();
extern void _ZN7S4422C1D1Ev();
Name_Map name_map_S4422C1[] = {
  NSPAIR(_ZN7S4422C1C1Ev),
  NSPAIR(_ZN7S4422C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4422C3_nt;
extern VTBL_ENTRY _ZTI10S4422C3_nt[];
extern  VTBL_ENTRY _ZTV10S4422C3_nt[];
extern Class_Descriptor cd_S4422C2;
extern VTBL_ENTRY _ZTI7S4422C2[];
extern  VTBL_ENTRY _ZTV7S4422C2[];
static Base_Class bases_S4422C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4422C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S4422C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4422C1[];
extern void _ZN7S4422C1D1Ev();
extern void _ZN7S4422C1D0Ev();
extern void _ZN10S4422C3_nt2v2Ev();
extern void _ZN10S4422C3_nt2v3Ev();
extern void _ZN10S4422C3_nt2v4Ev();
extern void _ZN7S4422C22v5Ev();
extern void _ZN7S4422C22v6Ev();
extern void _ZN7S4422C12v1Ev();
static  VTBL_ENTRY vtc_S4422C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4422C1[0]),
  (VTBL_ENTRY)&_ZN7S4422C1D1Ev,
  (VTBL_ENTRY)&_ZN7S4422C1D0Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v2Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v3Ev,
  (VTBL_ENTRY)&_ZN10S4422C3_nt2v4Ev,
  (VTBL_ENTRY)&_ZN7S4422C22v5Ev,
  (VTBL_ENTRY)&_ZN7S4422C22v6Ev,
  (VTBL_ENTRY)&_ZN7S4422C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S4422C1[];
extern  VTBL_ENTRY _ZTV7S4422C1[];
Class_Descriptor cd_S4422C1 = {  "S4422C1", // class name
  bases_S4422C1, 2,
  &(vtc_S4422C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,152), // object size
  NSPAIRA(_ZTI7S4422C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4422C1),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4423C3  {
  ::S10103C14_nt s4423c3f0;
  int s4423c3f1[2];
  char s4423c3f2;
  virtual  ~S4423C3(); // _ZN7S4423C3D1Ev
  virtual void  v2(); // _ZN7S4423C32v2Ev
  virtual void  v3(); // _ZN7S4423C32v3Ev
  virtual void  v4(); // _ZN7S4423C32v4Ev
  S4423C3(); // tgen
};
//SIG(-1 S4423C3) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S4423C3 ::~S4423C3(){ note_dtor("S4423C3", this);}
void  S4423C3 ::v2(){vfunc_called(this, "_ZN7S4423C32v2Ev");}
void  S4423C3 ::v3(){vfunc_called(this, "_ZN7S4423C32v3Ev");}
void  S4423C3 ::v4(){vfunc_called(this, "_ZN7S4423C32v4Ev");}
S4423C3 ::S4423C3(){ note_ctor("S4423C3", this);} // tgen

static void Test_S4423C3()
{
  extern Class_Descriptor cd_S4423C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S4423C3, buf);
    S4423C3 *dp, &lv = *(dp=new (buf) S4423C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S4423C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4423C3)");
    check_field_offset(lv, s4423c3f0, ABISELECT(8,4), "S4423C3.s4423c3f0");
    check_field_offset(lv, s4423c3f1, ABISELECT(24,16), "S4423C3.s4423c3f1");
    check_field_offset(lv, s4423c3f2, ABISELECT(32,24), "S4423C3.s4423c3f2");
    test_class_info(&lv, &cd_S4423C3);
    dp->~S4423C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4423C3(Test_S4423C3, "S4423C3", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S4423C3C1Ev();
extern void _ZN7S4423C3D1Ev();
Name_Map name_map_S4423C3[] = {
  NSPAIR(_ZN7S4423C3C1Ev),
  NSPAIR(_ZN7S4423C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S4423C3[];
extern void _ZN7S4423C3D1Ev();
extern void _ZN7S4423C3D0Ev();
extern void _ZN7S4423C32v2Ev();
extern void _ZN7S4423C32v3Ev();
extern void _ZN7S4423C32v4Ev();
static  VTBL_ENTRY vtc_S4423C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4423C3[0]),
  (VTBL_ENTRY)&_ZN7S4423C3D1Ev,
  (VTBL_ENTRY)&_ZN7S4423C3D0Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v3Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v4Ev,
};
extern VTBL_ENTRY _ZTI7S4423C3[];
extern  VTBL_ENTRY _ZTV7S4423C3[];
Class_Descriptor cd_S4423C3 = {  "S4423C3", // class name
  0,0,//no base classes
  &(vtc_S4423C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S4423C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S4423C3),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4423C2  : S4423C3 {
  int s4423c2f0[2];
  void *s4423c2f1[2];
  virtual  ~S4423C2(); // _ZN7S4423C2D1Ev
  virtual void  v5(); // _ZN7S4423C22v5Ev
  virtual void  v6(); // _ZN7S4423C22v6Ev
  S4423C2(); // tgen
};
//SIG(-1 S4423C2) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fi[2] Fp[2]}


 S4423C2 ::~S4423C2(){ note_dtor("S4423C2", this);}
void  S4423C2 ::v5(){vfunc_called(this, "_ZN7S4423C22v5Ev");}
void  S4423C2 ::v6(){vfunc_called(this, "_ZN7S4423C22v6Ev");}
S4423C2 ::S4423C2(){ note_ctor("S4423C2", this);} // tgen

static void Test_S4423C2()
{
  extern Class_Descriptor cd_S4423C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_S4423C2, buf);
    S4423C2 *dp, &lv = *(dp=new (buf) S4423C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(S4423C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4423C2)");
    check_base_class_offset(lv, (S4423C3*), 0, "S4423C2");
    check_field_offset(lv, s4423c2f0, ABISELECT(36,28), "S4423C2.s4423c2f0");
    check_field_offset(lv, s4423c2f1, ABISELECT(48,36), "S4423C2.s4423c2f1");
    test_class_info(&lv, &cd_S4423C2);
    dp->~S4423C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4423C2(Test_S4423C2, "S4423C2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7S4423C2C1Ev();
extern void _ZN7S4423C2D1Ev();
Name_Map name_map_S4423C2[] = {
  NSPAIR(_ZN7S4423C2C1Ev),
  NSPAIR(_ZN7S4423C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4423C3;
extern VTBL_ENTRY _ZTI7S4423C3[];
extern  VTBL_ENTRY _ZTV7S4423C3[];
static Base_Class bases_S4423C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4423C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4423C2[];
extern void _ZN7S4423C2D1Ev();
extern void _ZN7S4423C2D0Ev();
extern void _ZN7S4423C32v2Ev();
extern void _ZN7S4423C32v3Ev();
extern void _ZN7S4423C32v4Ev();
extern void _ZN7S4423C22v5Ev();
extern void _ZN7S4423C22v6Ev();
static  VTBL_ENTRY vtc_S4423C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4423C2[0]),
  (VTBL_ENTRY)&_ZN7S4423C2D1Ev,
  (VTBL_ENTRY)&_ZN7S4423C2D0Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v3Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v4Ev,
  (VTBL_ENTRY)&_ZN7S4423C22v5Ev,
  (VTBL_ENTRY)&_ZN7S4423C22v6Ev,
};
extern VTBL_ENTRY _ZTI7S4423C2[];
extern  VTBL_ENTRY _ZTV7S4423C2[];
Class_Descriptor cd_S4423C2 = {  "S4423C2", // class name
  bases_S4423C2, 1,
  &(vtc_S4423C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7S4423C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4423C2),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4423C7  {
  ::S10103C14_nt s4423c7f0;
  ::S10103C14_nt s4423c7f1;
  __tsi64 s4423c7f2;
  int s4423c7f3;
  void  mf4423c7(); // _ZN7S4423C78mf4423c7Ev
  virtual  ~S4423C7(); // _ZN7S4423C7D1Ev
  S4423C7(); // tgen
};
//SIG(-1 S4423C7) C1{ vd m FC2{ m Fp Fi FC3{ m}} FC2 FL Fi}


void  S4423C7 ::mf4423c7(){}
 S4423C7 ::~S4423C7(){ note_dtor("S4423C7", this);}
S4423C7 ::S4423C7(){ note_ctor("S4423C7", this);} // tgen

static void Test_S4423C7()
{
  extern Class_Descriptor cd_S4423C7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_S4423C7, buf);
    S4423C7 *dp, &lv = *(dp=new (buf) S4423C7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(S4423C7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4423C7)");
    check_field_offset(lv, s4423c7f0, ABISELECT(8,4), "S4423C7.s4423c7f0");
    check_field_offset(lv, s4423c7f1, ABISELECT(24,16), "S4423C7.s4423c7f1");
    check_field_offset(lv, s4423c7f2, ABISELECT(40,28), "S4423C7.s4423c7f2");
    check_field_offset(lv, s4423c7f3, ABISELECT(48,36), "S4423C7.s4423c7f3");
    test_class_info(&lv, &cd_S4423C7);
    dp->~S4423C7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4423C7(Test_S4423C7, "S4423C7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7S4423C7C1Ev();
extern void _ZN7S4423C7D1Ev();
Name_Map name_map_S4423C7[] = {
  NSPAIR(_ZN7S4423C7C1Ev),
  NSPAIR(_ZN7S4423C7D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S4423C7[];
extern void _ZN7S4423C7D1Ev();
extern void _ZN7S4423C7D0Ev();
static  VTBL_ENTRY vtc_S4423C7[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4423C7[0]),
  (VTBL_ENTRY)&_ZN7S4423C7D1Ev,
  (VTBL_ENTRY)&_ZN7S4423C7D0Ev,
};
extern VTBL_ENTRY _ZTI7S4423C7[];
extern  VTBL_ENTRY _ZTV7S4423C7[];
Class_Descriptor cd_S4423C7 = {  "S4423C7", // class name
  0,0,//no base classes
  &(vtc_S4423C7[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7S4423C7),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S4423C7),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4423C1  : S4423C2 {
  ::S10097C32 s4423c1f0;
  ::S4423C7 s4423c1f1;
  void *s4423c1f2[2];
  virtual  ~S4423C1(); // _ZN7S4423C1D1Ev
  virtual void  v1(); // _ZN7S4423C12v1Ev
  S4423C1(); // tgen
};
//SIG(1 S4423C1) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} vd v5 v6 Fi[2] Fp[2]} vd v1 FC6{ vd m FL[2] Fi[3]} FC7{ vd m FC4 FC4 FL Fi} Fp[2]}


 S4423C1 ::~S4423C1(){ note_dtor("S4423C1", this);}
void  S4423C1 ::v1(){vfunc_called(this, "_ZN7S4423C12v1Ev");}
S4423C1 ::S4423C1(){ note_ctor("S4423C1", this);} // tgen

static void Test_S4423C1()
{
  extern Class_Descriptor cd_S4423C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(23,32)];
    init_test(&cd_S4423C1, buf);
    S4423C1 *dp, &lv = *(dp=new (buf) S4423C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(176,124), "sizeof(S4423C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4423C1)");
    check_base_class_offset(lv, (S4423C3*)(S4423C2*), 0, "S4423C1");
    check_base_class_offset(lv, (S4423C2*), 0, "S4423C1");
    check_field_offset(lv, s4423c1f0, ABISELECT(64,44), "S4423C1.s4423c1f0");
    check_field_offset(lv, s4423c1f1, ABISELECT(104,76), "S4423C1.s4423c1f1");
    check_field_offset(lv, s4423c1f2, ABISELECT(160,116), "S4423C1.s4423c1f2");
    test_class_info(&lv, &cd_S4423C1);
    dp->~S4423C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4423C1(Test_S4423C1, "S4423C1", ABISELECT(176,124));

#else // __cplusplus

extern void _ZN7S4423C1C1Ev();
extern void _ZN7S4423C1D1Ev();
Name_Map name_map_S4423C1[] = {
  NSPAIR(_ZN7S4423C1C1Ev),
  NSPAIR(_ZN7S4423C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4423C3;
extern VTBL_ENTRY _ZTI7S4423C3[];
extern  VTBL_ENTRY _ZTV7S4423C3[];
extern Class_Descriptor cd_S4423C2;
extern VTBL_ENTRY _ZTI7S4423C2[];
extern  VTBL_ENTRY _ZTV7S4423C2[];
static Base_Class bases_S4423C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4423C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S4423C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4423C1[];
extern void _ZN7S4423C1D1Ev();
extern void _ZN7S4423C1D0Ev();
extern void _ZN7S4423C32v2Ev();
extern void _ZN7S4423C32v3Ev();
extern void _ZN7S4423C32v4Ev();
extern void _ZN7S4423C22v5Ev();
extern void _ZN7S4423C22v6Ev();
extern void _ZN7S4423C12v1Ev();
static  VTBL_ENTRY vtc_S4423C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4423C1[0]),
  (VTBL_ENTRY)&_ZN7S4423C1D1Ev,
  (VTBL_ENTRY)&_ZN7S4423C1D0Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v3Ev,
  (VTBL_ENTRY)&_ZN7S4423C32v4Ev,
  (VTBL_ENTRY)&_ZN7S4423C22v5Ev,
  (VTBL_ENTRY)&_ZN7S4423C22v6Ev,
  (VTBL_ENTRY)&_ZN7S4423C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S4423C1[];
extern  VTBL_ENTRY _ZTV7S4423C1[];
Class_Descriptor cd_S4423C1 = {  "S4423C1", // class name
  bases_S4423C1, 2,
  &(vtc_S4423C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(176,124), // object size
  NSPAIRA(_ZTI7S4423C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4423C1),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6683C5_nt  {
  void *s6683c5f0;
  int s6683c5f1[2];
  void  mf6683c5(); // _ZN10S6683C5_nt8mf6683c5Ev
};
//SIG(-1 S6683C5_nt) C1{ m Fp Fi[2]}


void  S6683C5_nt ::mf6683c5(){}

//skip512 S6683C5_nt

#else // __cplusplus

Class_Descriptor cd_S6683C5_nt = {  "S6683C5_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(16,12), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6683C4_nt  : S6683C5_nt {
};
//SIG(-1 S6683C4_nt) C1{ BC2{ m Fp Fi[2]}}



//skip512 S6683C4_nt

#else // __cplusplus

extern Class_Descriptor cd_S6683C5_nt;
static Base_Class bases_S6683C4_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6683C3_nt  {
  void *s6683c3f0;
  int s6683c3f1[2];
  ::S6683C4_nt s6683c3f2;
  void *s6683c3f3;
  void  mf6683c3(); // _ZN10S6683C3_nt8mf6683c3Ev
};
//SIG(-1 S6683C3_nt) C1{ m Fp Fi[2] FC2{ BC3{ m Fp Fi[2]}} Fp}


void  S6683C3_nt ::mf6683c3(){}

//skip512 S6683C3_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6683C6_nt  {
  void *s6683c6f0;
  int s6683c6f1;
  void *s6683c6f2;
  int s6683c6f3;
  void  mf6683c6(); // _ZN10S6683C6_nt8mf6683c6Ev
};
//SIG(-1 S6683C6_nt) C1{ m Fp Fi Fp Fi}


void  S6683C6_nt ::mf6683c6(){}

//skip512 S6683C6_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6683C2  {
  int s6683c2f0;
  void *s6683c2f1[3];
  int s6683c2f2[3];
  void *s6683c2f3[2];
  ::S6683C3_nt s6683c2f4;
  ::S6683C6_nt s6683c2f5;
  virtual void  v3(); // _ZN7S6683C22v3Ev
  virtual void  v4(); // _ZN7S6683C22v4Ev
  virtual void  v5(); // _ZN7S6683C22v5Ev
  virtual void  v6(); // _ZN7S6683C22v6Ev
  ~S6683C2(); // tgen
  S6683C2(); // tgen
};
//SIG(-1 S6683C2) C1{ v1 v2 v3 v4 Fi Fp[3] Fi[3] Fp[2] FC2{ m Fp Fi[2] FC3{ BC4{ m Fp Fi[2]}} Fp} FC5{ m Fp Fi Fp Fi}}


void  S6683C2 ::v3(){vfunc_called(this, "_ZN7S6683C22v3Ev");}
void  S6683C2 ::v4(){vfunc_called(this, "_ZN7S6683C22v4Ev");}
void  S6683C2 ::v5(){vfunc_called(this, "_ZN7S6683C22v5Ev");}
void  S6683C2 ::v6(){vfunc_called(this, "_ZN7S6683C22v6Ev");}
S6683C2 ::~S6683C2(){ note_dtor("S6683C2", this);} // tgen
S6683C2 ::S6683C2(){ note_ctor("S6683C2", this);} // tgen

static void Test_S6683C2()
{
  extern Class_Descriptor cd_S6683C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(19,22)];
    init_test(&cd_S6683C2, buf);
    S6683C2 *dp, &lv = *(dp=new (buf) S6683C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(144,84), "sizeof(S6683C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S6683C2)");
    check_field_offset(lv, s6683c2f0, ABISELECT(8,4), "S6683C2.s6683c2f0");
    check_field_offset(lv, s6683c2f1, ABISELECT(16,8), "S6683C2.s6683c2f1");
    check_field_offset(lv, s6683c2f2, ABISELECT(40,20), "S6683C2.s6683c2f2");
    check_field_offset(lv, s6683c2f3, ABISELECT(56,32), "S6683C2.s6683c2f3");
    check_field_offset(lv, s6683c2f4, ABISELECT(72,40), "S6683C2.s6683c2f4");
    check_field_offset(lv, s6683c2f5, ABISELECT(112,68), "S6683C2.s6683c2f5");
    test_class_info(&lv, &cd_S6683C2);
    dp->~S6683C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS6683C2(Test_S6683C2, "S6683C2", ABISELECT(144,84));

#else // __cplusplus

extern void _ZN7S6683C2C1Ev();
extern void _ZN7S6683C2D1Ev();
Name_Map name_map_S6683C2[] = {
  NSPAIR(_ZN7S6683C2C1Ev),
  NSPAIR(_ZN7S6683C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S6683C2[];
extern void _ZN7S6683C22v3Ev();
extern void _ZN7S6683C22v4Ev();
extern void _ZN7S6683C22v5Ev();
extern void _ZN7S6683C22v6Ev();
static  VTBL_ENTRY vtc_S6683C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S6683C2[0]),
  (VTBL_ENTRY)&_ZN7S6683C22v3Ev,
  (VTBL_ENTRY)&_ZN7S6683C22v4Ev,
  (VTBL_ENTRY)&_ZN7S6683C22v5Ev,
  (VTBL_ENTRY)&_ZN7S6683C22v6Ev,
};
extern VTBL_ENTRY _ZTI7S6683C2[];
extern  VTBL_ENTRY _ZTV7S6683C2[];
Class_Descriptor cd_S6683C2 = {  "S6683C2", // class name
  0,0,//no base classes
  &(vtc_S6683C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(144,84), // object size
  NSPAIRA(_ZTI7S6683C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S6683C2),6, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6683C1  : S6683C2 {
  void *s6683c1f0[2];
  virtual void  v1(); // _ZN7S6683C12v1Ev
  virtual void  v2(); // _ZN7S6683C12v2Ev
  ~S6683C1(); // tgen
  S6683C1(); // tgen
};
//SIG(1 S6683C1) C1{ BC2{ v3 v4 v5 v6 Fi Fp[3] Fi[3] Fp[2] FC3{ m Fp Fi[2] FC4{ BC5{ m Fp Fi[2]}} Fp} FC6{ m Fp Fi Fp Fi}} v1 v2 Fp[2]}


void  S6683C1 ::v1(){vfunc_called(this, "_ZN7S6683C12v1Ev");}
void  S6683C1 ::v2(){vfunc_called(this, "_ZN7S6683C12v2Ev");}
S6683C1 ::~S6683C1(){ note_dtor("S6683C1", this);} // tgen
S6683C1 ::S6683C1(){ note_ctor("S6683C1", this);} // tgen

static void Test_S6683C1()
{
  extern Class_Descriptor cd_S6683C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(21,24)];
    init_test(&cd_S6683C1, buf);
    S6683C1 *dp, &lv = *(dp=new (buf) S6683C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(160,92), "sizeof(S6683C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S6683C1)");
    check_base_class_offset(lv, (S6683C2*), 0, "S6683C1");
    check_field_offset(lv, s6683c1f0, ABISELECT(144,84), "S6683C1.s6683c1f0");
    test_class_info(&lv, &cd_S6683C1);
    dp->~S6683C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS6683C1(Test_S6683C1, "S6683C1", ABISELECT(160,92));

#else // __cplusplus

extern void _ZN7S6683C1C1Ev();
extern void _ZN7S6683C1D1Ev();
Name_Map name_map_S6683C1[] = {
  NSPAIR(_ZN7S6683C1C1Ev),
  NSPAIR(_ZN7S6683C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S6683C2;
extern VTBL_ENTRY _ZTI7S6683C2[];
extern  VTBL_ENTRY _ZTV7S6683C2[];
static Base_Class bases_S6683C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S6683C1[];
extern void _ZN7S6683C22v3Ev();
extern void _ZN7S6683C22v4Ev();
extern void _ZN7S6683C22v5Ev();
extern void _ZN7S6683C22v6Ev();
extern void _ZN7S6683C12v1Ev();
extern void _ZN7S6683C12v2Ev();
static  VTBL_ENTRY vtc_S6683C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S6683C1[0]),
  (VTBL_ENTRY)&_ZN7S6683C22v3Ev,
  (VTBL_ENTRY)&_ZN7S6683C22v4Ev,
  (VTBL_ENTRY)&_ZN7S6683C22v5Ev,
  (VTBL_ENTRY)&_ZN7S6683C22v6Ev,
  (VTBL_ENTRY)&_ZN7S6683C12v1Ev,
  (VTBL_ENTRY)&_ZN7S6683C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S6683C1[];
extern  VTBL_ENTRY _ZTV7S6683C1[];
Class_Descriptor cd_S6683C1 = {  "S6683C1", // class name
  bases_S6683C1, 1,
  &(vtc_S6683C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(160,92), // object size
  NSPAIRA(_ZTI7S6683C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S6683C1),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9377C2  {
  ::S10103C14_nt s9377c2f0;
  int s9377c2f1[2];
  char s9377c2f2;
  virtual  ~S9377C2(); // _ZN7S9377C2D1Ev
  virtual void  v3(); // _ZN7S9377C22v3Ev
  virtual void  v4(); // _ZN7S9377C22v4Ev
  virtual void  v5(); // _ZN7S9377C22v5Ev
  S9377C2(); // tgen
};
//SIG(-1 S9377C2) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S9377C2 ::~S9377C2(){ note_dtor("S9377C2", this);}
void  S9377C2 ::v3(){vfunc_called(this, "_ZN7S9377C22v3Ev");}
void  S9377C2 ::v4(){vfunc_called(this, "_ZN7S9377C22v4Ev");}
void  S9377C2 ::v5(){vfunc_called(this, "_ZN7S9377C22v5Ev");}
S9377C2 ::S9377C2(){ note_ctor("S9377C2", this);} // tgen

static void Test_S9377C2()
{
  extern Class_Descriptor cd_S9377C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S9377C2, buf);
    S9377C2 *dp, &lv = *(dp=new (buf) S9377C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S9377C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9377C2)");
    check_field_offset(lv, s9377c2f0, ABISELECT(8,4), "S9377C2.s9377c2f0");
    check_field_offset(lv, s9377c2f1, ABISELECT(24,16), "S9377C2.s9377c2f1");
    check_field_offset(lv, s9377c2f2, ABISELECT(32,24), "S9377C2.s9377c2f2");
    test_class_info(&lv, &cd_S9377C2);
    dp->~S9377C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9377C2(Test_S9377C2, "S9377C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S9377C2C1Ev();
extern void _ZN7S9377C2D1Ev();
Name_Map name_map_S9377C2[] = {
  NSPAIR(_ZN7S9377C2C1Ev),
  NSPAIR(_ZN7S9377C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9377C2[];
extern void _ZN7S9377C2D1Ev();
extern void _ZN7S9377C2D0Ev();
extern void _ZN7S9377C22v3Ev();
extern void _ZN7S9377C22v4Ev();
extern void _ZN7S9377C22v5Ev();
static  VTBL_ENTRY vtc_S9377C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9377C2[0]),
  (VTBL_ENTRY)&_ZN7S9377C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9377C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9377C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9377C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9377C22v5Ev,
};
extern VTBL_ENTRY _ZTI7S9377C2[];
extern  VTBL_ENTRY _ZTV7S9377C2[];
Class_Descriptor cd_S9377C2 = {  "S9377C2", // class name
  0,0,//no base classes
  &(vtc_S9377C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S9377C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9377C2),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9377C5  {
  int s9377c5f0;
  ::S10098C39 s9377c5f1;
  void  mf9377c5(); // _ZN7S9377C58mf9377c5Ev
  virtual  ~S9377C5(); // _ZN7S9377C5D1Ev
  S9377C5(); // tgen
};
//SIG(-1 S9377C5) C1{ vd m Fi FC2{ Fc Fi[3] FL[6] Fc[672]}}


void  S9377C5 ::mf9377c5(){}
 S9377C5 ::~S9377C5(){ note_dtor("S9377C5", this);}
S9377C5 ::S9377C5(){ note_ctor("S9377C5", this);} // tgen

static void Test_S9377C5()
{
  extern Class_Descriptor cd_S9377C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(95,187)];
    init_test(&cd_S9377C5, buf);
    S9377C5 *dp, &lv = *(dp=new (buf) S9377C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(752,744), "sizeof(S9377C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9377C5)");
    check_field_offset(lv, s9377c5f0, ABISELECT(8,4), "S9377C5.s9377c5f0");
    check_field_offset(lv, s9377c5f1, ABISELECT(16,8), "S9377C5.s9377c5f1");
    test_class_info(&lv, &cd_S9377C5);
    dp->~S9377C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9377C5(Test_S9377C5, "S9377C5", ABISELECT(752,744));

#else // __cplusplus

extern void _ZN7S9377C5C1Ev();
extern void _ZN7S9377C5D1Ev();
Name_Map name_map_S9377C5[] = {
  NSPAIR(_ZN7S9377C5C1Ev),
  NSPAIR(_ZN7S9377C5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9377C5[];
extern void _ZN7S9377C5D1Ev();
extern void _ZN7S9377C5D0Ev();
static  VTBL_ENTRY vtc_S9377C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9377C5[0]),
  (VTBL_ENTRY)&_ZN7S9377C5D1Ev,
  (VTBL_ENTRY)&_ZN7S9377C5D0Ev,
};
extern VTBL_ENTRY _ZTI7S9377C5[];
extern  VTBL_ENTRY _ZTV7S9377C5[];
Class_Descriptor cd_S9377C5 = {  "S9377C5", // class name
  0,0,//no base classes
  &(vtc_S9377C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(752,744), // object size
  NSPAIRA(_ZTI7S9377C5),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9377C5),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9377C1  : S9377C2 {
  void *s9377c1f0;
  int s9377c1f1;
  void *s9377c1f2[3];
  ::S9377C5 s9377c1f3;
  virtual  ~S9377C1(); // _ZN7S9377C1D1Ev
  virtual void  v1(); // _ZN7S9377C12v1Ev
  virtual void  v2(); // _ZN7S9377C12v2Ev
  S9377C1(); // tgen
};
//SIG(1 S9377C1) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fp Fi Fp[3] FC5{ vd m Fi FC6{ Fc Fi[3] FL[6] Fc[672]}}}


 S9377C1 ::~S9377C1(){ note_dtor("S9377C1", this);}
void  S9377C1 ::v1(){vfunc_called(this, "_ZN7S9377C12v1Ev");}
void  S9377C1 ::v2(){vfunc_called(this, "_ZN7S9377C12v2Ev");}
S9377C1 ::S9377C1(){ note_ctor("S9377C1", this);} // tgen

static void Test_S9377C1()
{
  extern Class_Descriptor cd_S9377C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(105,199)];
    init_test(&cd_S9377C1, buf);
    S9377C1 *dp, &lv = *(dp=new (buf) S9377C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(832,792), "sizeof(S9377C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9377C1)");
    check_base_class_offset(lv, (S9377C2*), 0, "S9377C1");
    check_field_offset(lv, s9377c1f0, ABISELECT(40,28), "S9377C1.s9377c1f0");
    check_field_offset(lv, s9377c1f1, ABISELECT(48,32), "S9377C1.s9377c1f1");
    check_field_offset(lv, s9377c1f2, ABISELECT(56,36), "S9377C1.s9377c1f2");
    check_field_offset(lv, s9377c1f3, ABISELECT(80,48), "S9377C1.s9377c1f3");
    test_class_info(&lv, &cd_S9377C1);
    dp->~S9377C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9377C1(Test_S9377C1, "S9377C1", ABISELECT(832,792));

#else // __cplusplus

extern void _ZN7S9377C1C1Ev();
extern void _ZN7S9377C1D1Ev();
Name_Map name_map_S9377C1[] = {
  NSPAIR(_ZN7S9377C1C1Ev),
  NSPAIR(_ZN7S9377C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9377C2;
extern VTBL_ENTRY _ZTI7S9377C2[];
extern  VTBL_ENTRY _ZTV7S9377C2[];
static Base_Class bases_S9377C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9377C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9377C1[];
extern void _ZN7S9377C1D1Ev();
extern void _ZN7S9377C1D0Ev();
extern void _ZN7S9377C22v3Ev();
extern void _ZN7S9377C22v4Ev();
extern void _ZN7S9377C22v5Ev();
extern void _ZN7S9377C12v1Ev();
extern void _ZN7S9377C12v2Ev();
static  VTBL_ENTRY vtc_S9377C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9377C1[0]),
  (VTBL_ENTRY)&_ZN7S9377C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9377C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9377C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9377C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9377C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9377C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9377C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9377C1[];
extern  VTBL_ENTRY _ZTV7S9377C1[];
Class_Descriptor cd_S9377C1 = {  "S9377C1", // class name
  bases_S9377C1, 1,
  &(vtc_S9377C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(832,792), // object size
  NSPAIRA(_ZTI7S9377C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9377C1),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9306C2  {
  ::S10103C14_nt s9306c2f0;
  int s9306c2f1[2];
  char s9306c2f2;
  virtual  ~S9306C2(); // _ZN7S9306C2D1Ev
  virtual void  v3(); // _ZN7S9306C22v3Ev
  virtual void  v4(); // _ZN7S9306C22v4Ev
  virtual void  v5(); // _ZN7S9306C22v5Ev
  S9306C2(); // tgen
};
//SIG(-1 S9306C2) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S9306C2 ::~S9306C2(){ note_dtor("S9306C2", this);}
void  S9306C2 ::v3(){vfunc_called(this, "_ZN7S9306C22v3Ev");}
void  S9306C2 ::v4(){vfunc_called(this, "_ZN7S9306C22v4Ev");}
void  S9306C2 ::v5(){vfunc_called(this, "_ZN7S9306C22v5Ev");}
S9306C2 ::S9306C2(){ note_ctor("S9306C2", this);} // tgen

static void Test_S9306C2()
{
  extern Class_Descriptor cd_S9306C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S9306C2, buf);
    S9306C2 *dp, &lv = *(dp=new (buf) S9306C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S9306C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9306C2)");
    check_field_offset(lv, s9306c2f0, ABISELECT(8,4), "S9306C2.s9306c2f0");
    check_field_offset(lv, s9306c2f1, ABISELECT(24,16), "S9306C2.s9306c2f1");
    check_field_offset(lv, s9306c2f2, ABISELECT(32,24), "S9306C2.s9306c2f2");
    test_class_info(&lv, &cd_S9306C2);
    dp->~S9306C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9306C2(Test_S9306C2, "S9306C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S9306C2C1Ev();
extern void _ZN7S9306C2D1Ev();
Name_Map name_map_S9306C2[] = {
  NSPAIR(_ZN7S9306C2C1Ev),
  NSPAIR(_ZN7S9306C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9306C2[];
extern void _ZN7S9306C2D1Ev();
extern void _ZN7S9306C2D0Ev();
extern void _ZN7S9306C22v3Ev();
extern void _ZN7S9306C22v4Ev();
extern void _ZN7S9306C22v5Ev();
static  VTBL_ENTRY vtc_S9306C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9306C2[0]),
  (VTBL_ENTRY)&_ZN7S9306C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9306C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9306C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9306C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9306C22v5Ev,
};
extern VTBL_ENTRY _ZTI7S9306C2[];
extern  VTBL_ENTRY _ZTV7S9306C2[];
Class_Descriptor cd_S9306C2 = {  "S9306C2", // class name
  0,0,//no base classes
  &(vtc_S9306C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S9306C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9306C2),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9306C6_nt  {
  void *s9306c6f0[2];
  void  mf9306c6(); // _ZN10S9306C6_nt8mf9306c6Ev
};
//SIG(-1 S9306C6_nt) C1{ m Fp[2]}


void  S9306C6_nt ::mf9306c6(){}

//skip512 S9306C6_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9306C1  : S9306C2 {
  ::S10103C111_nt s9306c1f0;
  void *s9306c1f1;
  ::S9306C6_nt s9306c1f2;
  ::S10103C106 s9306c1f3;
  virtual  ~S9306C1(); // _ZN7S9306C1D1Ev
  virtual void  v1(); // _ZN7S9306C12v1Ev
  virtual void  v2(); // _ZN7S9306C12v2Ev
  S9306C1(); // tgen
};
//SIG(1 S9306C1) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 FC5{ m Fp[2]} Fp FC6{ m Fp[2]} FC7{ m Fp Fi[2] FC8{ m}}}


 S9306C1 ::~S9306C1(){ note_dtor("S9306C1", this);}
void  S9306C1 ::v1(){vfunc_called(this, "_ZN7S9306C12v1Ev");}
void  S9306C1 ::v2(){vfunc_called(this, "_ZN7S9306C12v2Ev");}
S9306C1 ::S9306C1(){ note_ctor("S9306C1", this);} // tgen

static void Test_S9306C1()
{
  extern Class_Descriptor cd_S9306C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(14,17)];
    init_test(&cd_S9306C1, buf);
    S9306C1 *dp, &lv = *(dp=new (buf) S9306C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(104,64), "sizeof(S9306C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9306C1)");
    check_base_class_offset(lv, (S9306C2*), 0, "S9306C1");
    check_field_offset(lv, s9306c1f0, ABISELECT(40,28), "S9306C1.s9306c1f0");
    check_field_offset(lv, s9306c1f1, ABISELECT(56,36), "S9306C1.s9306c1f1");
    check_field_offset(lv, s9306c1f2, ABISELECT(64,40), "S9306C1.s9306c1f2");
    check_field_offset(lv, s9306c1f3, ABISELECT(80,48), "S9306C1.s9306c1f3");
    test_class_info(&lv, &cd_S9306C1);
    dp->~S9306C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9306C1(Test_S9306C1, "S9306C1", ABISELECT(104,64));

#else // __cplusplus

extern void _ZN7S9306C1C1Ev();
extern void _ZN7S9306C1D1Ev();
Name_Map name_map_S9306C1[] = {
  NSPAIR(_ZN7S9306C1C1Ev),
  NSPAIR(_ZN7S9306C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9306C2;
extern VTBL_ENTRY _ZTI7S9306C2[];
extern  VTBL_ENTRY _ZTV7S9306C2[];
static Base_Class bases_S9306C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9306C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9306C1[];
extern void _ZN7S9306C1D1Ev();
extern void _ZN7S9306C1D0Ev();
extern void _ZN7S9306C22v3Ev();
extern void _ZN7S9306C22v4Ev();
extern void _ZN7S9306C22v5Ev();
extern void _ZN7S9306C12v1Ev();
extern void _ZN7S9306C12v2Ev();
static  VTBL_ENTRY vtc_S9306C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9306C1[0]),
  (VTBL_ENTRY)&_ZN7S9306C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9306C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9306C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9306C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9306C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9306C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9306C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9306C1[];
extern  VTBL_ENTRY _ZTV7S9306C1[];
Class_Descriptor cd_S9306C1 = {  "S9306C1", // class name
  bases_S9306C1, 1,
  &(vtc_S9306C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(104,64), // object size
  NSPAIRA(_ZTI7S9306C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9306C1),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12714C1  {
  int s12714c1f0;
  void *s12714c1f1;
  int s12714c1f2[3];
  void *s12714c1f3[9];
  int s12714c1f4[2];
  void *s12714c1f5[2];
  int s12714c1f6;
  void *s12714c1f7;
  int s12714c1f8;
  void *s12714c1f9[3];
  int s12714c1f10[2];
  void *s12714c1f11[5];
  int s12714c1f12;
  void *s12714c1f13[3];
  int s12714c1f14[2];
  void *s12714c1f15;
  int s12714c1f16;
  void *s12714c1f17[2];
  int s12714c1f18[3];
  void *s12714c1f19;
  int s12714c1f20[2];
  void *s12714c1f21;
};
//SIG(1 S12714C1) C1{ Fi Fp Fi[3] Fp[9] Fi[2] Fp[2] Fi Fp Fi Fp[3] Fi[2] Fp[5] Fi Fp[3] Fi[2] Fp Fi Fp[2] Fi[3] Fp Fi[2] Fp}



static void Test_S12714C1()
{
  {
    init_simple_test("S12714C1");
    S12714C1 lv;
    check2(sizeof(lv), ABISELECT(336,192), "sizeof(S12714C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S12714C1)");
    check_field_offset(lv, s12714c1f0, 0, "S12714C1.s12714c1f0");
    check_field_offset(lv, s12714c1f1, ABISELECT(8,4), "S12714C1.s12714c1f1");
    check_field_offset(lv, s12714c1f2, ABISELECT(16,8), "S12714C1.s12714c1f2");
    check_field_offset(lv, s12714c1f3, ABISELECT(32,20), "S12714C1.s12714c1f3");
    check_field_offset(lv, s12714c1f4, ABISELECT(104,56), "S12714C1.s12714c1f4");
    check_field_offset(lv, s12714c1f5, ABISELECT(112,64), "S12714C1.s12714c1f5");
    check_field_offset(lv, s12714c1f6, ABISELECT(128,72), "S12714C1.s12714c1f6");
    check_field_offset(lv, s12714c1f7, ABISELECT(136,76), "S12714C1.s12714c1f7");
    check_field_offset(lv, s12714c1f8, ABISELECT(144,80), "S12714C1.s12714c1f8");
    check_field_offset(lv, s12714c1f9, ABISELECT(152,84), "S12714C1.s12714c1f9");
    check_field_offset(lv, s12714c1f10, ABISELECT(176,96), "S12714C1.s12714c1f10");
    check_field_offset(lv, s12714c1f11, ABISELECT(184,104), "S12714C1.s12714c1f11");
    check_field_offset(lv, s12714c1f12, ABISELECT(224,124), "S12714C1.s12714c1f12");
    check_field_offset(lv, s12714c1f13, ABISELECT(232,128), "S12714C1.s12714c1f13");
    check_field_offset(lv, s12714c1f14, ABISELECT(256,140), "S12714C1.s12714c1f14");
    check_field_offset(lv, s12714c1f15, ABISELECT(264,148), "S12714C1.s12714c1f15");
    check_field_offset(lv, s12714c1f16, ABISELECT(272,152), "S12714C1.s12714c1f16");
    check_field_offset(lv, s12714c1f17, ABISELECT(280,156), "S12714C1.s12714c1f17");
    check_field_offset(lv, s12714c1f18, ABISELECT(296,164), "S12714C1.s12714c1f18");
    check_field_offset(lv, s12714c1f19, ABISELECT(312,176), "S12714C1.s12714c1f19");
    check_field_offset(lv, s12714c1f20, ABISELECT(320,180), "S12714C1.s12714c1f20");
    check_field_offset(lv, s12714c1f21, ABISELECT(328,188), "S12714C1.s12714c1f21");
  }
}
static Arrange_To_Call_Me vS12714C1(Test_S12714C1, "S12714C1", ABISELECT(336,192));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10164C2_nt  {
  virtual  ~S10164C2_nt(); // _ZN11S10164C2_ntD1Ev
  virtual void  v7(); // _ZN11S10164C2_nt2v7Ev
  virtual void  v8(); // _ZN11S10164C2_nt2v8Ev
  virtual void  v9(); // _ZN11S10164C2_nt2v9Ev
  virtual void  v10(); // _ZN11S10164C2_nt3v10Ev
  virtual void  v11(); // _ZN11S10164C2_nt3v11Ev
  virtual void  v12(); // _ZN11S10164C2_nt3v12Ev
  S10164C2_nt(); // tgen
};
//SIG(-1 S10164C2_nt) C1{ vd v1 v2 v3 v4 v5 v6}


 S10164C2_nt ::~S10164C2_nt(){ note_dtor("S10164C2_nt", this);}
void  S10164C2_nt ::v7(){vfunc_called(this, "_ZN11S10164C2_nt2v7Ev");}
void  S10164C2_nt ::v8(){vfunc_called(this, "_ZN11S10164C2_nt2v8Ev");}
void  S10164C2_nt ::v9(){vfunc_called(this, "_ZN11S10164C2_nt2v9Ev");}
void  S10164C2_nt ::v10(){vfunc_called(this, "_ZN11S10164C2_nt3v10Ev");}
void  S10164C2_nt ::v11(){vfunc_called(this, "_ZN11S10164C2_nt3v11Ev");}
void  S10164C2_nt ::v12(){vfunc_called(this, "_ZN11S10164C2_nt3v12Ev");}
S10164C2_nt ::S10164C2_nt(){ note_ctor("S10164C2_nt", this);} // tgen

//skip512 S10164C2_nt

#else // __cplusplus

extern void _ZN11S10164C2_ntC1Ev();
extern void _ZN11S10164C2_ntD1Ev();
Name_Map name_map_S10164C2_nt[] = {
  NSPAIR(_ZN11S10164C2_ntC1Ev),
  NSPAIR(_ZN11S10164C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S10164C2_nt[];
extern void _ZN11S10164C2_ntD1Ev();
extern void _ZN11S10164C2_ntD0Ev();
extern void _ZN11S10164C2_nt2v7Ev();
extern void _ZN11S10164C2_nt2v8Ev();
extern void _ZN11S10164C2_nt2v9Ev();
extern void _ZN11S10164C2_nt3v10Ev();
extern void _ZN11S10164C2_nt3v11Ev();
extern void _ZN11S10164C2_nt3v12Ev();
static  VTBL_ENTRY vtc_S10164C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S10164C2_nt[0]),
  (VTBL_ENTRY)&_ZN11S10164C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt2v7Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt2v8Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt2v9Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt3v10Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt3v11Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt3v12Ev,
};
extern VTBL_ENTRY _ZTI11S10164C2_nt[];
VTBL_ENTRY *P__ZTI11S10164C2_nt = _ZTI11S10164C2_nt; 
extern  VTBL_ENTRY _ZTV11S10164C2_nt[];
Class_Descriptor cd_S10164C2_nt = {  "S10164C2_nt", // class name
  0,0,//no base classes
  &(vtc_S10164C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI11S10164C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV11S10164C2_nt),10, //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

struct  S10164C1  : S10164C2_nt {
  void *s10164c1f0;
  ::S10104C22_nt s10164c1f1;
  int s10164c1f2;
  void *s10164c1f3[4];
  int s10164c1f4;
  char s10164c1f5;
  void *s10164c1f6[4];
  char s10164c1f7[3];
  void *s10164c1f8[9];
  char s10164c1f9;
  virtual  ~S10164C1(); // _ZN8S10164C1D1Ev
  virtual void  v1(); // _ZN8S10164C12v1Ev
  virtual void  v2(); // _ZN8S10164C12v2Ev
  virtual void  v3(); // _ZN8S10164C12v3Ev
  virtual void  v4(); // _ZN8S10164C12v4Ev
  virtual void  v5(); // _ZN8S10164C12v5Ev
  virtual void  v6(); // _ZN8S10164C12v6Ev
  S10164C1(); // tgen
};
//SIG(1 S10164C1) C1{ BC2{ vd v7 v8 v9 v10 v11 v12} vd v1 v2 v3 v4 v5 v6 Fp FC3{ m FL[4]} Fi Fp[4] Fi Fc Fp[4] Fc[3] Fp[9] Fc}


 S10164C1 ::~S10164C1(){ note_dtor("S10164C1", this);}
void  S10164C1 ::v1(){vfunc_called(this, "_ZN8S10164C12v1Ev");}
void  S10164C1 ::v2(){vfunc_called(this, "_ZN8S10164C12v2Ev");}
void  S10164C1 ::v3(){vfunc_called(this, "_ZN8S10164C12v3Ev");}
void  S10164C1 ::v4(){vfunc_called(this, "_ZN8S10164C12v4Ev");}
void  S10164C1 ::v5(){vfunc_called(this, "_ZN8S10164C12v5Ev");}
void  S10164C1 ::v6(){vfunc_called(this, "_ZN8S10164C12v6Ev");}
S10164C1 ::S10164C1(){ note_ctor("S10164C1", this);} // tgen

static void Test_S10164C1()
{
  extern Class_Descriptor cd_S10164C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,33)];
    init_test(&cd_S10164C1, buf);
    S10164C1 *dp, &lv = *(dp=new (buf) S10164C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,128), "sizeof(S10164C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10164C1)");
    check_base_class_offset(lv, (S10164C2_nt*), 0, "S10164C1");
    check_field_offset(lv, s10164c1f0, ABISELECT(8,4), "S10164C1.s10164c1f0");
    check_field_offset(lv, s10164c1f1, ABISELECT(16,8), "S10164C1.s10164c1f1");
    check_field_offset(lv, s10164c1f2, ABISELECT(48,40), "S10164C1.s10164c1f2");
    check_field_offset(lv, s10164c1f3, ABISELECT(56,44), "S10164C1.s10164c1f3");
    check_field_offset(lv, s10164c1f4, ABISELECT(88,60), "S10164C1.s10164c1f4");
    check_field_offset(lv, s10164c1f5, ABISELECT(92,64), "S10164C1.s10164c1f5");
    check_field_offset(lv, s10164c1f6, ABISELECT(96,68), "S10164C1.s10164c1f6");
    check_field_offset(lv, s10164c1f7, ABISELECT(128,84), "S10164C1.s10164c1f7");
    check_field_offset(lv, s10164c1f8, ABISELECT(136,88), "S10164C1.s10164c1f8");
    check_field_offset(lv, s10164c1f9, ABISELECT(208,124), "S10164C1.s10164c1f9");
    test_class_info(&lv, &cd_S10164C1);
    dp->~S10164C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10164C1(Test_S10164C1, "S10164C1", ABISELECT(216,128));

#else // __cplusplus

extern void _ZN8S10164C1C1Ev();
extern void _ZN8S10164C1D1Ev();
Name_Map name_map_S10164C1[] = {
  NSPAIR(_ZN8S10164C1C1Ev),
  NSPAIR(_ZN8S10164C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10164C2_nt;
extern VTBL_ENTRY _ZTI11S10164C2_nt[];
extern  VTBL_ENTRY _ZTV11S10164C2_nt[];
static Base_Class bases_S10164C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10164C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S10164C1[];
extern void _ZN8S10164C1D1Ev();
extern void _ZN8S10164C1D0Ev();
extern void _ZN11S10164C2_nt2v7Ev();
extern void _ZN11S10164C2_nt2v8Ev();
extern void _ZN11S10164C2_nt2v9Ev();
extern void _ZN11S10164C2_nt3v10Ev();
extern void _ZN11S10164C2_nt3v11Ev();
extern void _ZN11S10164C2_nt3v12Ev();
extern void _ZN8S10164C12v1Ev();
extern void _ZN8S10164C12v2Ev();
extern void _ZN8S10164C12v3Ev();
extern void _ZN8S10164C12v4Ev();
extern void _ZN8S10164C12v5Ev();
extern void _ZN8S10164C12v6Ev();
static  VTBL_ENTRY vtc_S10164C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S10164C1[0]),
  (VTBL_ENTRY)&_ZN8S10164C1D1Ev,
  (VTBL_ENTRY)&_ZN8S10164C1D0Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt2v7Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt2v8Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt2v9Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt3v10Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt3v11Ev,
  (VTBL_ENTRY)&_ZN11S10164C2_nt3v12Ev,
  (VTBL_ENTRY)&_ZN8S10164C12v1Ev,
  (VTBL_ENTRY)&_ZN8S10164C12v2Ev,
  (VTBL_ENTRY)&_ZN8S10164C12v3Ev,
  (VTBL_ENTRY)&_ZN8S10164C12v4Ev,
  (VTBL_ENTRY)&_ZN8S10164C12v5Ev,
  (VTBL_ENTRY)&_ZN8S10164C12v6Ev,
};
extern VTBL_ENTRY _ZTI8S10164C1[];
extern  VTBL_ENTRY _ZTV8S10164C1[];
Class_Descriptor cd_S10164C1 = {  "S10164C1", // class name
  bases_S10164C1, 1,
  &(vtc_S10164C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(216,128), // object size
  NSPAIRA(_ZTI8S10164C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV8S10164C1),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14641C2_nt  {
  int s14641c2f0[3];
};
//SIG(-1 S14641C2_nt) C1{ Fi[3]}



//skip512 S14641C2_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14641C3  {
  int s14641c3f0[4];
  void *s14641c3f1;
};
//SIG(-1 S14641C3) C1{ Fi[4] Fp}



static void Test_S14641C3()
{
  {
    init_simple_test("S14641C3");
    S14641C3 lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(S14641C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14641C3)");
    check_field_offset(lv, s14641c3f0, 0, "S14641C3.s14641c3f0");
    check_field_offset(lv, s14641c3f1, 16, "S14641C3.s14641c3f1");
  }
}
static Arrange_To_Call_Me vS14641C3(Test_S14641C3, "S14641C3", ABISELECT(24,20));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14641C1  {
  void *s14641c1f0[3];
  int s14641c1f1[7];
  void *s14641c1f2[4];
  char s14641c1f3[2];
  void *s14641c1f4[2];
  char s14641c1f5;
  int s14641c1f6[2];
  char s14641c1f7[3];
  void *s14641c1f8;
  int s14641c1f9[5];
  void *s14641c1f10;
  int s14641c1f11[2];
  void *s14641c1f12;
  ::S14641C2_nt s14641c1f13;
  ::S14641C3 s14641c1f14;
  int s14641c1f15;
  void *s14641c1f16[2];
};
//SIG(1 S14641C1) C1{ Fp[3] Fi[7] Fp[4] Fc[2] Fp[2] Fc Fi[2] Fc[3] Fp Fi[5] Fp Fi[2] Fp FC2{ Fi[3]} FC3{ Fi[4] Fp} Fi Fp[2]}



static void Test_S14641C1()
{
  {
    init_simple_test("S14641C1");
    S14641C1 lv;
    check2(sizeof(lv), ABISELECT(248,168), "sizeof(S14641C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14641C1)");
    check_field_offset(lv, s14641c1f0, 0, "S14641C1.s14641c1f0");
    check_field_offset(lv, s14641c1f1, ABISELECT(24,12), "S14641C1.s14641c1f1");
    check_field_offset(lv, s14641c1f2, ABISELECT(56,40), "S14641C1.s14641c1f2");
    check_field_offset(lv, s14641c1f3, ABISELECT(88,56), "S14641C1.s14641c1f3");
    check_field_offset(lv, s14641c1f4, ABISELECT(96,60), "S14641C1.s14641c1f4");
    check_field_offset(lv, s14641c1f5, ABISELECT(112,68), "S14641C1.s14641c1f5");
    check_field_offset(lv, s14641c1f6, ABISELECT(116,72), "S14641C1.s14641c1f6");
    check_field_offset(lv, s14641c1f7, ABISELECT(124,80), "S14641C1.s14641c1f7");
    check_field_offset(lv, s14641c1f8, ABISELECT(128,84), "S14641C1.s14641c1f8");
    check_field_offset(lv, s14641c1f9, ABISELECT(136,88), "S14641C1.s14641c1f9");
    check_field_offset(lv, s14641c1f10, ABISELECT(160,108), "S14641C1.s14641c1f10");
    check_field_offset(lv, s14641c1f11, ABISELECT(168,112), "S14641C1.s14641c1f11");
    check_field_offset(lv, s14641c1f12, ABISELECT(176,120), "S14641C1.s14641c1f12");
    check_field_offset(lv, s14641c1f13, ABISELECT(184,124), "S14641C1.s14641c1f13");
    check_field_offset(lv, s14641c1f14, ABISELECT(200,136), "S14641C1.s14641c1f14");
    check_field_offset(lv, s14641c1f15, ABISELECT(224,156), "S14641C1.s14641c1f15");
    check_field_offset(lv, s14641c1f16, ABISELECT(232,160), "S14641C1.s14641c1f16");
  }
}
static Arrange_To_Call_Me vS14641C1(Test_S14641C1, "S14641C1", ABISELECT(248,168));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17959C3  {
  ::S10103C96 s17959c3f0;
  ::S10103C13_nt s17959c3f1;
  void  mf17959c3(); // _ZN8S17959C39mf17959c3Ev
};
//SIG(-1 S17959C3) C1{ m FC2{ vd m FL[2] Fi FC3{ m Fp Fi FC4{ m}} FC3 FC3 FC3 FC5{ m Fp}} FC6{ m FC3 Fi}}


void  S17959C3 ::mf17959c3(){}

static void Test_S17959C3()
{
  {
    init_simple_test("S17959C3");
    S17959C3 lv;
    check2(sizeof(lv), ABISELECT(128,92), "sizeof(S17959C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17959C3)");
    check_field_offset(lv, s17959c3f0, 0, "S17959C3.s17959c3f0");
    check_field_offset(lv, s17959c3f1, ABISELECT(104,76), "S17959C3.s17959c3f1");
  }
}
static Arrange_To_Call_Me vS17959C3(Test_S17959C3, "S17959C3", ABISELECT(128,92));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17959C2  {
  ::S17959C3 s17959c2f0;
  void *s17959c2f1;
  void  mf17959c2(); // _ZN8S17959C29mf17959c2Ev
};
//SIG(-1 S17959C2) C1{ m FC2{ m FC3{ vd m FL[2] Fi FC4{ m Fp Fi FC5{ m}} FC4 FC4 FC4 FC6{ m Fp}} FC7{ m FC4 Fi}} Fp}


void  S17959C2 ::mf17959c2(){}

static void Test_S17959C2()
{
  {
    init_simple_test("S17959C2");
    S17959C2 lv;
    check2(sizeof(lv), ABISELECT(136,96), "sizeof(S17959C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17959C2)");
    check_field_offset(lv, s17959c2f0, 0, "S17959C2.s17959c2f0");
    check_field_offset(lv, s17959c2f1, ABISELECT(128,92), "S17959C2.s17959c2f1");
  }
}
static Arrange_To_Call_Me vS17959C2(Test_S17959C2, "S17959C2", ABISELECT(136,96));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17959C1  {
  void *s17959c1f0[2];
  ::S17959C2 s17959c1f1;
  void  mf17959c1(); // _ZN8S17959C19mf17959c1Ev
};
//SIG(1 S17959C1) C1{ m Fp[2] FC2{ m FC3{ m FC4{ vd m FL[2] Fi FC5{ m Fp Fi FC6{ m}} FC5 FC5 FC5 FC7{ m Fp}} FC8{ m FC5 Fi}} Fp}}


void  S17959C1 ::mf17959c1(){}

static void Test_S17959C1()
{
  {
    init_simple_test("S17959C1");
    S17959C1 lv;
    check2(sizeof(lv), ABISELECT(152,104), "sizeof(S17959C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17959C1)");
    check_field_offset(lv, s17959c1f0, 0, "S17959C1.s17959c1f0");
    check_field_offset(lv, s17959c1f1, ABISELECT(16,8), "S17959C1.s17959c1f1");
  }
}
static Arrange_To_Call_Me vS17959C1(Test_S17959C1, "S17959C1", ABISELECT(152,104));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16172C5_nt  : S10103C35 {
};
//SIG(-1 S16172C5_nt) C1{ BC2{ m Fp Fi FC3{ m} FC3}}



//skip512 S16172C5_nt

#else // __cplusplus

extern Class_Descriptor cd_S10103C35;
static Base_Class bases_S16172C5_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C35,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16172C1  {
  ::S10103C86 s16172c1f0;
  ::S16172C5_nt s16172c1f1;
  ::S10103C105 s16172c1f2;
  int s16172c1f3[4];
  void *s16172c1f4;
  ::S10103C22_nt s16172c1f5;
  void  mf16172c1(); // _ZN8S16172C19mf16172c1Ev
};
//SIG(1 S16172C1) C1{ m FC2{ m Fp Fi FC3{ m} FC4{ m}} FC5{ BC6{ m Fp Fi FC7{ m} FC7}} FC8{ m Fp} Fi[4] Fp FC9{ m FC10{ FL[4]}}}


void  S16172C1 ::mf16172c1(){}

static void Test_S16172C1()
{
  {
    init_simple_test("S16172C1");
    S16172C1 lv;
    check2(sizeof(lv), ABISELECT(96,80), "sizeof(S16172C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S16172C1)");
    check_field_offset(lv, s16172c1f0, 0, "S16172C1.s16172c1f0");
    check_field_offset(lv, s16172c1f1, ABISELECT(16,12), "S16172C1.s16172c1f1");
    check_field_offset(lv, s16172c1f2, ABISELECT(32,24), "S16172C1.s16172c1f2");
    check_field_offset(lv, s16172c1f3, ABISELECT(40,28), "S16172C1.s16172c1f3");
    check_field_offset(lv, s16172c1f4, ABISELECT(56,44), "S16172C1.s16172c1f4");
    check_field_offset(lv, s16172c1f5, ABISELECT(64,48), "S16172C1.s16172c1f5");
  }
}
static Arrange_To_Call_Me vS16172C1(Test_S16172C1, "S16172C1", ABISELECT(96,80));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5742C3_nt  {
  int s5742c3f0[2];
  void *s5742c3f1;
  void  mf5742c3(); // _ZN10S5742C3_nt8mf5742c3Ev
};
//SIG(-1 S5742C3_nt) C1{ m Fi[2] Fp}


void  S5742C3_nt ::mf5742c3(){}

//skip512 S5742C3_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5742C2  {
  int s5742c2f0;
  ::S5742C3_nt s5742c2f1;
  void  mf5742c2(); // _ZN7S5742C28mf5742c2Ev
};
//SIG(-1 S5742C2) C1{ m Fi FC2{ m Fi[2] Fp}}


void  S5742C2 ::mf5742c2(){}

static void Test_S5742C2()
{
  {
    init_simple_test("S5742C2");
    S5742C2 lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S5742C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5742C2)");
    check_field_offset(lv, s5742c2f0, 0, "S5742C2.s5742c2f0");
    check_field_offset(lv, s5742c2f1, ABISELECT(8,4), "S5742C2.s5742c2f1");
  }
}
static Arrange_To_Call_Me vS5742C2(Test_S5742C2, "S5742C2", ABISELECT(24,16));

#else // __cplusplus

Class_Descriptor cd_S5742C2 = {  "S5742C2", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(24,16), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5742C4  {
  char s5742c4f0[30];
  void  mf5742c4(); // _ZN7S5742C48mf5742c4Ev
};
//SIG(-1 S5742C4) C1{ m Fc[30]}


void  S5742C4 ::mf5742c4(){}

static void Test_S5742C4()
{
  {
    init_simple_test("S5742C4");
    S5742C4 lv;
    check2(sizeof(lv), 30, "sizeof(S5742C4)");
    check2(__alignof__(lv), 1, "__alignof__(S5742C4)");
    check_field_offset(lv, s5742c4f0, 0, "S5742C4.s5742c4f0");
  }
}
static Arrange_To_Call_Me vS5742C4(Test_S5742C4, "S5742C4", 30);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

union  S5742C5  {
  int s5742c5f0;
  int s5742c5f1[2];
  int s5742c5f2[3];
  int s5742c5f3[4];
  int s5742c5f4;
  int s5742c5f5[2];
  int s5742c5f6[3];
  int s5742c5f7[4];
};
//SIG(1 S5742C5) U1{ Fi Fi[2] Fi[3] Fi[4] Fi Fi[2] Fi[3] Fi[4]}

#endif // __cplusplus
#ifdef __cplusplus

struct  S5742C1  : S5742C2 {
  ::S5742C4 s5742c1f0;
  ::S5742C5 s5742c1f1;
  ::S10103C105 s5742c1f2;
};
//SIG(1 S5742C1) C1{ BC2{ m Fi FC3{ m Fi[2] Fp}} FC4{ m Fc[30]} FU5{ Fi Fi[2] Fi[3] Fi[4] Fi Fi[2] Fi[3] Fi[4]} FC6{ m Fp}}



static void Test_S5742C1()
{
  extern Class_Descriptor cd_S5742C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,18)];
    init_test(&cd_S5742C1, buf);
    S5742C1 &lv = *(new (buf) S5742C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,68), "sizeof(S5742C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5742C1)");
    check_base_class_offset(lv, (S5742C2*), 0, "S5742C1");
    check_field_offset(lv, s5742c1f0, ABISELECT(24,16), "S5742C1.s5742c1f0");
    check_field_offset(lv, s5742c1f1, ABISELECT(56,48), "S5742C1.s5742c1f1");
    check_field_offset(lv, s5742c1f2, ABISELECT(72,64), "S5742C1.s5742c1f2");
    test_class_info(&lv, &cd_S5742C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5742C1(Test_S5742C1, "S5742C1", ABISELECT(80,68));

#else // __cplusplus

extern Class_Descriptor cd_S5742C2;
static Base_Class bases_S5742C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S5742C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5742C1 = {  "S5742C1", // class name
  bases_S5742C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(80,68), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14282C2  {
  ::S14641C2_nt s14282c2f0;
  int s14282c2f1;
  char s14282c2f2[256];
  int s14282c2f3[9];
  short s14282c2f4[2];
  int s14282c2f5[16];
  void *s14282c2f6;
  short s14282c2f7[2];
};
//SIG(1 S14282C2) C1{ FC2{ Fi[3]} Fi Fc[256] Fi[9] Fs[2] Fi[16] Fp Fs[2]}



static void Test_S14282C2()
{
  {
    init_simple_test("S14282C2");
    S14282C2 lv;
    check2(sizeof(lv), ABISELECT(392,384), "sizeof(S14282C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14282C2)");
    check_field_offset(lv, s14282c2f0, 0, "S14282C2.s14282c2f0");
    check_field_offset(lv, s14282c2f1, 12, "S14282C2.s14282c2f1");
    check_field_offset(lv, s14282c2f2, 16, "S14282C2.s14282c2f2");
    check_field_offset(lv, s14282c2f3, 272, "S14282C2.s14282c2f3");
    check_field_offset(lv, s14282c2f4, 308, "S14282C2.s14282c2f4");
    check_field_offset(lv, s14282c2f5, 312, "S14282C2.s14282c2f5");
    check_field_offset(lv, s14282c2f6, 376, "S14282C2.s14282c2f6");
    check_field_offset(lv, s14282c2f7, ABISELECT(384,380), "S14282C2.s14282c2f7");
  }
}
static Arrange_To_Call_Me vS14282C2(Test_S14282C2, "S14282C2", ABISELECT(392,384));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14282C1  {
  void *s14282c1f0;
  int s14282c1f1[2];
  ::S14282C2 s14282c1f2[8];
  char s14282c1f3[272];
  int s14282c1f4;
  ::S14641C2_nt s14282c1f5;
  int s14282c1f6[2];
  char s14282c1f7[4];
};
//SIG(1 S14282C1) C1{ Fp Fi[2] FC2{ FC3{ Fi[3]} Fi Fc[256] Fi[9] Fs[2] Fi[16] Fp Fs[2]}[8] Fc[272] Fi FC3 Fi[2] Fc[4]}



static void Test_S14282C1()
{
  {
    init_simple_test("S14282C1");
    S14282C1 lv;
    check2(sizeof(lv), ABISELECT(3456,3384), "sizeof(S14282C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14282C1)");
    check_field_offset(lv, s14282c1f0, 0, "S14282C1.s14282c1f0");
    check_field_offset(lv, s14282c1f1, ABISELECT(8,4), "S14282C1.s14282c1f1");
    check_field_offset(lv, s14282c1f2, ABISELECT(16,12), "S14282C1.s14282c1f2");
    check_field_offset(lv, s14282c1f3, ABISELECT(3152,3084), "S14282C1.s14282c1f3");
    check_field_offset(lv, s14282c1f4, ABISELECT(3424,3356), "S14282C1.s14282c1f4");
    check_field_offset(lv, s14282c1f5, ABISELECT(3428,3360), "S14282C1.s14282c1f5");
    check_field_offset(lv, s14282c1f6, ABISELECT(3440,3372), "S14282C1.s14282c1f6");
    check_field_offset(lv, s14282c1f7, ABISELECT(3448,3380), "S14282C1.s14282c1f7");
  }
}
static Arrange_To_Call_Me vS14282C1(Test_S14282C1, "S14282C1", ABISELECT(3456,3384));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2081C4  {
  ::S10103C14_nt s2081c4f0;
  int s2081c4f1[2];
  char s2081c4f2;
  virtual  ~S2081C4(); // _ZN7S2081C4D1Ev
  virtual void  v2(); // _ZN7S2081C42v2Ev
  virtual void  v3(); // _ZN7S2081C42v3Ev
  virtual void  v4(); // _ZN7S2081C42v4Ev
  S2081C4(); // tgen
};
//SIG(-1 S2081C4) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S2081C4 ::~S2081C4(){ note_dtor("S2081C4", this);}
void  S2081C4 ::v2(){vfunc_called(this, "_ZN7S2081C42v2Ev");}
void  S2081C4 ::v3(){vfunc_called(this, "_ZN7S2081C42v3Ev");}
void  S2081C4 ::v4(){vfunc_called(this, "_ZN7S2081C42v4Ev");}
S2081C4 ::S2081C4(){ note_ctor("S2081C4", this);} // tgen

static void Test_S2081C4()
{
  extern Class_Descriptor cd_S2081C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2081C4, buf);
    S2081C4 *dp, &lv = *(dp=new (buf) S2081C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2081C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2081C4)");
    check_field_offset(lv, s2081c4f0, ABISELECT(8,4), "S2081C4.s2081c4f0");
    check_field_offset(lv, s2081c4f1, ABISELECT(24,16), "S2081C4.s2081c4f1");
    check_field_offset(lv, s2081c4f2, ABISELECT(32,24), "S2081C4.s2081c4f2");
    test_class_info(&lv, &cd_S2081C4);
    dp->~S2081C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2081C4(Test_S2081C4, "S2081C4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2081C4C1Ev();
extern void _ZN7S2081C4D1Ev();
Name_Map name_map_S2081C4[] = {
  NSPAIR(_ZN7S2081C4C1Ev),
  NSPAIR(_ZN7S2081C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S2081C4[];
extern void _ZN7S2081C4D1Ev();
extern void _ZN7S2081C4D0Ev();
extern void _ZN7S2081C42v2Ev();
extern void _ZN7S2081C42v3Ev();
extern void _ZN7S2081C42v4Ev();
static  VTBL_ENTRY vtc_S2081C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2081C4[0]),
  (VTBL_ENTRY)&_ZN7S2081C4D1Ev,
  (VTBL_ENTRY)&_ZN7S2081C4D0Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v4Ev,
};
extern VTBL_ENTRY _ZTI7S2081C4[];
extern  VTBL_ENTRY _ZTV7S2081C4[];
Class_Descriptor cd_S2081C4 = {  "S2081C4", // class name
  0,0,//no base classes
  &(vtc_S2081C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2081C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S2081C4),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2081C3_nt  : S2081C4 {
  void *s2081c3f0;
  virtual void  v5(); // _ZN10S2081C3_nt2v5Ev
  virtual void  v6(); // _ZN10S2081C3_nt2v6Ev
  ~S2081C3_nt(); // tgen
  S2081C3_nt(); // tgen
};
//SIG(-1 S2081C3_nt) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} v1 v2 Fp}


void  S2081C3_nt ::v5(){vfunc_called(this, "_ZN10S2081C3_nt2v5Ev");}
void  S2081C3_nt ::v6(){vfunc_called(this, "_ZN10S2081C3_nt2v6Ev");}
S2081C3_nt ::~S2081C3_nt(){ note_dtor("S2081C3_nt", this);} // tgen
S2081C3_nt ::S2081C3_nt(){ note_ctor("S2081C3_nt", this);} // tgen

//skip512 S2081C3_nt

#else // __cplusplus

extern void _ZN10S2081C3_ntC1Ev();
extern void _ZN10S2081C3_ntD1Ev();
Name_Map name_map_S2081C3_nt[] = {
  NSPAIR(_ZN10S2081C3_ntC1Ev),
  NSPAIR(_ZN10S2081C3_ntD1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2081C4;
extern VTBL_ENTRY _ZTI7S2081C4[];
extern  VTBL_ENTRY _ZTV7S2081C4[];
static Base_Class bases_S2081C3_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2081C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S2081C3_nt[];
extern void _ZN10S2081C3_ntD1Ev();
extern void _ZN10S2081C3_ntD0Ev();
extern void _ZN7S2081C42v2Ev();
extern void _ZN7S2081C42v3Ev();
extern void _ZN7S2081C42v4Ev();
extern void _ZN10S2081C3_nt2v5Ev();
extern void _ZN10S2081C3_nt2v6Ev();
static  VTBL_ENTRY vtc_S2081C3_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S2081C3_nt[0]),
  (VTBL_ENTRY)&_ZN10S2081C3_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_ntD0Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v4Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_nt2v6Ev,
};
extern VTBL_ENTRY _ZTI10S2081C3_nt[];
VTBL_ENTRY *P__ZTI10S2081C3_nt = _ZTI10S2081C3_nt; 
extern  VTBL_ENTRY _ZTV10S2081C3_nt[];
Class_Descriptor cd_S2081C3_nt = {  "S2081C3_nt", // class name
  bases_S2081C3_nt, 1,
  &(vtc_S2081C3_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI10S2081C3_nt),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV10S2081C3_nt),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2081C2  : S2081C3_nt {
  void *s2081c2f0;
  int s2081c2f1;
  virtual  ~S2081C2(); // _ZN7S2081C2D1Ev
  virtual void  v7(); // _ZN7S2081C22v7Ev
  S2081C2(); // tgen
};
//SIG(-1 S2081C2) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} v5 v6 Fp} vd v1 Fp Fi}


 S2081C2 ::~S2081C2(){ note_dtor("S2081C2", this);}
void  S2081C2 ::v7(){vfunc_called(this, "_ZN7S2081C22v7Ev");}
S2081C2 ::S2081C2(){ note_ctor("S2081C2", this);} // tgen

static void Test_S2081C2()
{
  extern Class_Descriptor cd_S2081C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S2081C2, buf);
    S2081C2 *dp, &lv = *(dp=new (buf) S2081C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S2081C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2081C2)");
    check_base_class_offset(lv, (S2081C4*)(S2081C3_nt*), 0, "S2081C2");
    check_base_class_offset(lv, (S2081C3_nt*), 0, "S2081C2");
    check_field_offset(lv, s2081c2f0, ABISELECT(48,32), "S2081C2.s2081c2f0");
    check_field_offset(lv, s2081c2f1, ABISELECT(56,36), "S2081C2.s2081c2f1");
    test_class_info(&lv, &cd_S2081C2);
    dp->~S2081C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2081C2(Test_S2081C2, "S2081C2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7S2081C2C1Ev();
extern void _ZN7S2081C2D1Ev();
Name_Map name_map_S2081C2[] = {
  NSPAIR(_ZN7S2081C2C1Ev),
  NSPAIR(_ZN7S2081C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2081C4;
extern VTBL_ENTRY _ZTI7S2081C4[];
extern  VTBL_ENTRY _ZTV7S2081C4[];
extern Class_Descriptor cd_S2081C3_nt;
extern VTBL_ENTRY _ZTI10S2081C3_nt[];
extern  VTBL_ENTRY _ZTV10S2081C3_nt[];
static Base_Class bases_S2081C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2081C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2081C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2081C2[];
extern void _ZN7S2081C2D1Ev();
extern void _ZN7S2081C2D0Ev();
extern void _ZN7S2081C42v2Ev();
extern void _ZN7S2081C42v3Ev();
extern void _ZN7S2081C42v4Ev();
extern void _ZN10S2081C3_nt2v5Ev();
extern void _ZN10S2081C3_nt2v6Ev();
extern void _ZN7S2081C22v7Ev();
static  VTBL_ENTRY vtc_S2081C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2081C2[0]),
  (VTBL_ENTRY)&_ZN7S2081C2D1Ev,
  (VTBL_ENTRY)&_ZN7S2081C2D0Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v4Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_nt2v6Ev,
  (VTBL_ENTRY)&_ZN7S2081C22v7Ev,
};
extern VTBL_ENTRY _ZTI7S2081C2[];
extern  VTBL_ENTRY _ZTV7S2081C2[];
Class_Descriptor cd_S2081C2 = {  "S2081C2", // class name
  bases_S2081C2, 2,
  &(vtc_S2081C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7S2081C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2081C2),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2081C1  : S2081C2 {
  int s2081c1f0[2];
  void *s2081c1f1[2];
  virtual  ~S2081C1(); // _ZN7S2081C1D1Ev
  virtual void  v1(); // _ZN7S2081C12v1Ev
  S2081C1(); // tgen
};
//SIG(1 S2081C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 FC5{ m Fp Fi FC6{ m}} Fi[2] Fc} v5 v6 Fp} vd v7 Fp Fi} vd v1 Fi[2] Fp[2]}


 S2081C1 ::~S2081C1(){ note_dtor("S2081C1", this);}
void  S2081C1 ::v1(){vfunc_called(this, "_ZN7S2081C12v1Ev");}
S2081C1 ::S2081C1(){ note_ctor("S2081C1", this);} // tgen

static void Test_S2081C1()
{
  extern Class_Descriptor cd_S2081C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,15)];
    init_test(&cd_S2081C1, buf);
    S2081C1 *dp, &lv = *(dp=new (buf) S2081C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,56), "sizeof(S2081C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2081C1)");
    check_base_class_offset(lv, (S2081C4*)(S2081C3_nt*)(S2081C2*), 0, "S2081C1");
    check_base_class_offset(lv, (S2081C3_nt*)(S2081C2*), 0, "S2081C1");
    check_base_class_offset(lv, (S2081C2*), 0, "S2081C1");
    check_field_offset(lv, s2081c1f0, ABISELECT(60,40), "S2081C1.s2081c1f0");
    check_field_offset(lv, s2081c1f1, ABISELECT(72,48), "S2081C1.s2081c1f1");
    test_class_info(&lv, &cd_S2081C1);
    dp->~S2081C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2081C1(Test_S2081C1, "S2081C1", ABISELECT(88,56));

#else // __cplusplus

extern void _ZN7S2081C1C1Ev();
extern void _ZN7S2081C1D1Ev();
Name_Map name_map_S2081C1[] = {
  NSPAIR(_ZN7S2081C1C1Ev),
  NSPAIR(_ZN7S2081C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2081C4;
extern VTBL_ENTRY _ZTI7S2081C4[];
extern  VTBL_ENTRY _ZTV7S2081C4[];
extern Class_Descriptor cd_S2081C3_nt;
extern VTBL_ENTRY _ZTI10S2081C3_nt[];
extern  VTBL_ENTRY _ZTV10S2081C3_nt[];
extern Class_Descriptor cd_S2081C2;
extern VTBL_ENTRY _ZTI7S2081C2[];
extern  VTBL_ENTRY _ZTV7S2081C2[];
static Base_Class bases_S2081C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2081C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2081C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S2081C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2081C1[];
extern void _ZN7S2081C1D1Ev();
extern void _ZN7S2081C1D0Ev();
extern void _ZN7S2081C42v2Ev();
extern void _ZN7S2081C42v3Ev();
extern void _ZN7S2081C42v4Ev();
extern void _ZN10S2081C3_nt2v5Ev();
extern void _ZN10S2081C3_nt2v6Ev();
extern void _ZN7S2081C22v7Ev();
extern void _ZN7S2081C12v1Ev();
static  VTBL_ENTRY vtc_S2081C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2081C1[0]),
  (VTBL_ENTRY)&_ZN7S2081C1D1Ev,
  (VTBL_ENTRY)&_ZN7S2081C1D0Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2081C42v4Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S2081C3_nt2v6Ev,
  (VTBL_ENTRY)&_ZN7S2081C22v7Ev,
  (VTBL_ENTRY)&_ZN7S2081C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S2081C1[];
extern  VTBL_ENTRY _ZTV7S2081C1[];
Class_Descriptor cd_S2081C1 = {  "S2081C1", // class name
  bases_S2081C1, 3,
  &(vtc_S2081C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(88,56), // object size
  NSPAIRA(_ZTI7S2081C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2081C1),11, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2079C4  {
  ::S10103C14_nt s2079c4f0;
  int s2079c4f1[2];
  char s2079c4f2;
  virtual  ~S2079C4(); // _ZN7S2079C4D1Ev
  virtual void  v2(); // _ZN7S2079C42v2Ev
  virtual void  v3(); // _ZN7S2079C42v3Ev
  virtual void  v4(); // _ZN7S2079C42v4Ev
  S2079C4(); // tgen
};
//SIG(-1 S2079C4) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S2079C4 ::~S2079C4(){ note_dtor("S2079C4", this);}
void  S2079C4 ::v2(){vfunc_called(this, "_ZN7S2079C42v2Ev");}
void  S2079C4 ::v3(){vfunc_called(this, "_ZN7S2079C42v3Ev");}
void  S2079C4 ::v4(){vfunc_called(this, "_ZN7S2079C42v4Ev");}
S2079C4 ::S2079C4(){ note_ctor("S2079C4", this);} // tgen

static void Test_S2079C4()
{
  extern Class_Descriptor cd_S2079C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2079C4, buf);
    S2079C4 *dp, &lv = *(dp=new (buf) S2079C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2079C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2079C4)");
    check_field_offset(lv, s2079c4f0, ABISELECT(8,4), "S2079C4.s2079c4f0");
    check_field_offset(lv, s2079c4f1, ABISELECT(24,16), "S2079C4.s2079c4f1");
    check_field_offset(lv, s2079c4f2, ABISELECT(32,24), "S2079C4.s2079c4f2");
    test_class_info(&lv, &cd_S2079C4);
    dp->~S2079C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2079C4(Test_S2079C4, "S2079C4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2079C4C1Ev();
extern void _ZN7S2079C4D1Ev();
Name_Map name_map_S2079C4[] = {
  NSPAIR(_ZN7S2079C4C1Ev),
  NSPAIR(_ZN7S2079C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S2079C4[];
extern void _ZN7S2079C4D1Ev();
extern void _ZN7S2079C4D0Ev();
extern void _ZN7S2079C42v2Ev();
extern void _ZN7S2079C42v3Ev();
extern void _ZN7S2079C42v4Ev();
static  VTBL_ENTRY vtc_S2079C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2079C4[0]),
  (VTBL_ENTRY)&_ZN7S2079C4D1Ev,
  (VTBL_ENTRY)&_ZN7S2079C4D0Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v4Ev,
};
extern VTBL_ENTRY _ZTI7S2079C4[];
extern  VTBL_ENTRY _ZTV7S2079C4[];
Class_Descriptor cd_S2079C4 = {  "S2079C4", // class name
  0,0,//no base classes
  &(vtc_S2079C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2079C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S2079C4),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2079C3  : S2079C4 {
  void *s2079c3f0;
  virtual void  v5(); // _ZN7S2079C32v5Ev
  virtual void  v6(); // _ZN7S2079C32v6Ev
  ~S2079C3(); // tgen
  S2079C3(); // tgen
};
//SIG(-1 S2079C3) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} v1 v2 Fp}


void  S2079C3 ::v5(){vfunc_called(this, "_ZN7S2079C32v5Ev");}
void  S2079C3 ::v6(){vfunc_called(this, "_ZN7S2079C32v6Ev");}
S2079C3 ::~S2079C3(){ note_dtor("S2079C3", this);} // tgen
S2079C3 ::S2079C3(){ note_ctor("S2079C3", this);} // tgen

static void Test_S2079C3()
{
  extern Class_Descriptor cd_S2079C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_S2079C3, buf);
    S2079C3 *dp, &lv = *(dp=new (buf) S2079C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(S2079C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2079C3)");
    check_base_class_offset(lv, (S2079C4*), 0, "S2079C3");
    check_field_offset(lv, s2079c3f0, ABISELECT(40,28), "S2079C3.s2079c3f0");
    test_class_info(&lv, &cd_S2079C3);
    dp->~S2079C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2079C3(Test_S2079C3, "S2079C3", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7S2079C3C1Ev();
extern void _ZN7S2079C3D1Ev();
Name_Map name_map_S2079C3[] = {
  NSPAIR(_ZN7S2079C3C1Ev),
  NSPAIR(_ZN7S2079C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2079C4;
extern VTBL_ENTRY _ZTI7S2079C4[];
extern  VTBL_ENTRY _ZTV7S2079C4[];
static Base_Class bases_S2079C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2079C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2079C3[];
extern void _ZN7S2079C3D1Ev();
extern void _ZN7S2079C3D0Ev();
extern void _ZN7S2079C42v2Ev();
extern void _ZN7S2079C42v3Ev();
extern void _ZN7S2079C42v4Ev();
extern void _ZN7S2079C32v5Ev();
extern void _ZN7S2079C32v6Ev();
static  VTBL_ENTRY vtc_S2079C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2079C3[0]),
  (VTBL_ENTRY)&_ZN7S2079C3D1Ev,
  (VTBL_ENTRY)&_ZN7S2079C3D0Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2079C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2079C32v6Ev,
};
extern VTBL_ENTRY _ZTI7S2079C3[];
extern  VTBL_ENTRY _ZTV7S2079C3[];
Class_Descriptor cd_S2079C3 = {  "S2079C3", // class name
  bases_S2079C3, 1,
  &(vtc_S2079C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7S2079C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2079C3),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2079C2  : S2079C3 {
  void *s2079c2f0;
  int s2079c2f1;
  virtual  ~S2079C2(); // _ZN7S2079C2D1Ev
  virtual void  v7(); // _ZN7S2079C22v7Ev
  S2079C2(); // tgen
};
//SIG(-1 S2079C2) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} v5 v6 Fp} vd v1 Fp Fi}


 S2079C2 ::~S2079C2(){ note_dtor("S2079C2", this);}
void  S2079C2 ::v7(){vfunc_called(this, "_ZN7S2079C22v7Ev");}
S2079C2 ::S2079C2(){ note_ctor("S2079C2", this);} // tgen

static void Test_S2079C2()
{
  extern Class_Descriptor cd_S2079C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S2079C2, buf);
    S2079C2 *dp, &lv = *(dp=new (buf) S2079C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S2079C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2079C2)");
    check_base_class_offset(lv, (S2079C4*)(S2079C3*), 0, "S2079C2");
    check_base_class_offset(lv, (S2079C3*), 0, "S2079C2");
    check_field_offset(lv, s2079c2f0, ABISELECT(48,32), "S2079C2.s2079c2f0");
    check_field_offset(lv, s2079c2f1, ABISELECT(56,36), "S2079C2.s2079c2f1");
    test_class_info(&lv, &cd_S2079C2);
    dp->~S2079C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2079C2(Test_S2079C2, "S2079C2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7S2079C2C1Ev();
extern void _ZN7S2079C2D1Ev();
Name_Map name_map_S2079C2[] = {
  NSPAIR(_ZN7S2079C2C1Ev),
  NSPAIR(_ZN7S2079C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2079C4;
extern VTBL_ENTRY _ZTI7S2079C4[];
extern  VTBL_ENTRY _ZTV7S2079C4[];
extern Class_Descriptor cd_S2079C3;
extern VTBL_ENTRY _ZTI7S2079C3[];
extern  VTBL_ENTRY _ZTV7S2079C3[];
static Base_Class bases_S2079C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2079C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2079C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2079C2[];
extern void _ZN7S2079C2D1Ev();
extern void _ZN7S2079C2D0Ev();
extern void _ZN7S2079C42v2Ev();
extern void _ZN7S2079C42v3Ev();
extern void _ZN7S2079C42v4Ev();
extern void _ZN7S2079C32v5Ev();
extern void _ZN7S2079C32v6Ev();
extern void _ZN7S2079C22v7Ev();
static  VTBL_ENTRY vtc_S2079C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2079C2[0]),
  (VTBL_ENTRY)&_ZN7S2079C2D1Ev,
  (VTBL_ENTRY)&_ZN7S2079C2D0Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2079C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2079C32v6Ev,
  (VTBL_ENTRY)&_ZN7S2079C22v7Ev,
};
extern VTBL_ENTRY _ZTI7S2079C2[];
extern  VTBL_ENTRY _ZTV7S2079C2[];
Class_Descriptor cd_S2079C2 = {  "S2079C2", // class name
  bases_S2079C2, 2,
  &(vtc_S2079C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7S2079C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2079C2),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2079C7_nt  {
  int s2079c7f0[5];
};
//SIG(-1 S2079C7_nt) C1{ Fi[5]}



//skip512 S2079C7_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2079C1  : S2079C2 {
  ::S2079C7_nt s2079c1f0;
  virtual  ~S2079C1(); // _ZN7S2079C1D1Ev
  virtual void  v1(); // _ZN7S2079C12v1Ev
  S2079C1(); // tgen
};
//SIG(1 S2079C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 FC5{ m Fp Fi FC6{ m}} Fi[2] Fc} v5 v6 Fp} vd v7 Fp Fi} vd v1 FC7{ Fi[5]}}


 S2079C1 ::~S2079C1(){ note_dtor("S2079C1", this);}
void  S2079C1 ::v1(){vfunc_called(this, "_ZN7S2079C12v1Ev");}
S2079C1 ::S2079C1(){ note_ctor("S2079C1", this);} // tgen

static void Test_S2079C1()
{
  extern Class_Descriptor cd_S2079C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,16)];
    init_test(&cd_S2079C1, buf);
    S2079C1 *dp, &lv = *(dp=new (buf) S2079C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,60), "sizeof(S2079C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2079C1)");
    check_base_class_offset(lv, (S2079C4*)(S2079C3*)(S2079C2*), 0, "S2079C1");
    check_base_class_offset(lv, (S2079C3*)(S2079C2*), 0, "S2079C1");
    check_base_class_offset(lv, (S2079C2*), 0, "S2079C1");
    check_field_offset(lv, s2079c1f0, ABISELECT(60,40), "S2079C1.s2079c1f0");
    test_class_info(&lv, &cd_S2079C1);
    dp->~S2079C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2079C1(Test_S2079C1, "S2079C1", ABISELECT(80,60));

#else // __cplusplus

extern void _ZN7S2079C1C1Ev();
extern void _ZN7S2079C1D1Ev();
Name_Map name_map_S2079C1[] = {
  NSPAIR(_ZN7S2079C1C1Ev),
  NSPAIR(_ZN7S2079C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2079C4;
extern VTBL_ENTRY _ZTI7S2079C4[];
extern  VTBL_ENTRY _ZTV7S2079C4[];
extern Class_Descriptor cd_S2079C3;
extern VTBL_ENTRY _ZTI7S2079C3[];
extern  VTBL_ENTRY _ZTV7S2079C3[];
extern Class_Descriptor cd_S2079C2;
extern VTBL_ENTRY _ZTI7S2079C2[];
extern  VTBL_ENTRY _ZTV7S2079C2[];
static Base_Class bases_S2079C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2079C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2079C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S2079C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2079C1[];
extern void _ZN7S2079C1D1Ev();
extern void _ZN7S2079C1D0Ev();
extern void _ZN7S2079C42v2Ev();
extern void _ZN7S2079C42v3Ev();
extern void _ZN7S2079C42v4Ev();
extern void _ZN7S2079C32v5Ev();
extern void _ZN7S2079C32v6Ev();
extern void _ZN7S2079C22v7Ev();
extern void _ZN7S2079C12v1Ev();
static  VTBL_ENTRY vtc_S2079C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2079C1[0]),
  (VTBL_ENTRY)&_ZN7S2079C1D1Ev,
  (VTBL_ENTRY)&_ZN7S2079C1D0Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2079C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2079C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2079C32v6Ev,
  (VTBL_ENTRY)&_ZN7S2079C22v7Ev,
  (VTBL_ENTRY)&_ZN7S2079C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S2079C1[];
extern  VTBL_ENTRY _ZTV7S2079C1[];
Class_Descriptor cd_S2079C1 = {  "S2079C1", // class name
  bases_S2079C1, 3,
  &(vtc_S2079C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,60), // object size
  NSPAIRA(_ZTI7S2079C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2079C1),11, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2080C4  {
  ::S10103C14_nt s2080c4f0;
  int s2080c4f1[2];
  char s2080c4f2;
  virtual  ~S2080C4(); // _ZN7S2080C4D1Ev
  virtual void  v2(); // _ZN7S2080C42v2Ev
  virtual void  v3(); // _ZN7S2080C42v3Ev
  virtual void  v4(); // _ZN7S2080C42v4Ev
  S2080C4(); // tgen
};
//SIG(-1 S2080C4) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S2080C4 ::~S2080C4(){ note_dtor("S2080C4", this);}
void  S2080C4 ::v2(){vfunc_called(this, "_ZN7S2080C42v2Ev");}
void  S2080C4 ::v3(){vfunc_called(this, "_ZN7S2080C42v3Ev");}
void  S2080C4 ::v4(){vfunc_called(this, "_ZN7S2080C42v4Ev");}
S2080C4 ::S2080C4(){ note_ctor("S2080C4", this);} // tgen

static void Test_S2080C4()
{
  extern Class_Descriptor cd_S2080C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2080C4, buf);
    S2080C4 *dp, &lv = *(dp=new (buf) S2080C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2080C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2080C4)");
    check_field_offset(lv, s2080c4f0, ABISELECT(8,4), "S2080C4.s2080c4f0");
    check_field_offset(lv, s2080c4f1, ABISELECT(24,16), "S2080C4.s2080c4f1");
    check_field_offset(lv, s2080c4f2, ABISELECT(32,24), "S2080C4.s2080c4f2");
    test_class_info(&lv, &cd_S2080C4);
    dp->~S2080C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2080C4(Test_S2080C4, "S2080C4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2080C4C1Ev();
extern void _ZN7S2080C4D1Ev();
Name_Map name_map_S2080C4[] = {
  NSPAIR(_ZN7S2080C4C1Ev),
  NSPAIR(_ZN7S2080C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S2080C4[];
extern void _ZN7S2080C4D1Ev();
extern void _ZN7S2080C4D0Ev();
extern void _ZN7S2080C42v2Ev();
extern void _ZN7S2080C42v3Ev();
extern void _ZN7S2080C42v4Ev();
static  VTBL_ENTRY vtc_S2080C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2080C4[0]),
  (VTBL_ENTRY)&_ZN7S2080C4D1Ev,
  (VTBL_ENTRY)&_ZN7S2080C4D0Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v4Ev,
};
extern VTBL_ENTRY _ZTI7S2080C4[];
extern  VTBL_ENTRY _ZTV7S2080C4[];
Class_Descriptor cd_S2080C4 = {  "S2080C4", // class name
  0,0,//no base classes
  &(vtc_S2080C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2080C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S2080C4),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2080C3  : S2080C4 {
  void *s2080c3f0;
  virtual void  v5(); // _ZN7S2080C32v5Ev
  virtual void  v6(); // _ZN7S2080C32v6Ev
  ~S2080C3(); // tgen
  S2080C3(); // tgen
};
//SIG(-1 S2080C3) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} v1 v2 Fp}


void  S2080C3 ::v5(){vfunc_called(this, "_ZN7S2080C32v5Ev");}
void  S2080C3 ::v6(){vfunc_called(this, "_ZN7S2080C32v6Ev");}
S2080C3 ::~S2080C3(){ note_dtor("S2080C3", this);} // tgen
S2080C3 ::S2080C3(){ note_ctor("S2080C3", this);} // tgen

static void Test_S2080C3()
{
  extern Class_Descriptor cd_S2080C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_S2080C3, buf);
    S2080C3 *dp, &lv = *(dp=new (buf) S2080C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(S2080C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2080C3)");
    check_base_class_offset(lv, (S2080C4*), 0, "S2080C3");
    check_field_offset(lv, s2080c3f0, ABISELECT(40,28), "S2080C3.s2080c3f0");
    test_class_info(&lv, &cd_S2080C3);
    dp->~S2080C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2080C3(Test_S2080C3, "S2080C3", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7S2080C3C1Ev();
extern void _ZN7S2080C3D1Ev();
Name_Map name_map_S2080C3[] = {
  NSPAIR(_ZN7S2080C3C1Ev),
  NSPAIR(_ZN7S2080C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2080C4;
extern VTBL_ENTRY _ZTI7S2080C4[];
extern  VTBL_ENTRY _ZTV7S2080C4[];
static Base_Class bases_S2080C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2080C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2080C3[];
extern void _ZN7S2080C3D1Ev();
extern void _ZN7S2080C3D0Ev();
extern void _ZN7S2080C42v2Ev();
extern void _ZN7S2080C42v3Ev();
extern void _ZN7S2080C42v4Ev();
extern void _ZN7S2080C32v5Ev();
extern void _ZN7S2080C32v6Ev();
static  VTBL_ENTRY vtc_S2080C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2080C3[0]),
  (VTBL_ENTRY)&_ZN7S2080C3D1Ev,
  (VTBL_ENTRY)&_ZN7S2080C3D0Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2080C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2080C32v6Ev,
};
extern VTBL_ENTRY _ZTI7S2080C3[];
extern  VTBL_ENTRY _ZTV7S2080C3[];
Class_Descriptor cd_S2080C3 = {  "S2080C3", // class name
  bases_S2080C3, 1,
  &(vtc_S2080C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7S2080C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2080C3),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2080C2  : S2080C3 {
  void *s2080c2f0;
  int s2080c2f1;
  virtual  ~S2080C2(); // _ZN7S2080C2D1Ev
  virtual void  v7(); // _ZN7S2080C22v7Ev
  S2080C2(); // tgen
};
//SIG(-1 S2080C2) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} v5 v6 Fp} vd v1 Fp Fi}


 S2080C2 ::~S2080C2(){ note_dtor("S2080C2", this);}
void  S2080C2 ::v7(){vfunc_called(this, "_ZN7S2080C22v7Ev");}
S2080C2 ::S2080C2(){ note_ctor("S2080C2", this);} // tgen

static void Test_S2080C2()
{
  extern Class_Descriptor cd_S2080C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S2080C2, buf);
    S2080C2 *dp, &lv = *(dp=new (buf) S2080C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S2080C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2080C2)");
    check_base_class_offset(lv, (S2080C4*)(S2080C3*), 0, "S2080C2");
    check_base_class_offset(lv, (S2080C3*), 0, "S2080C2");
    check_field_offset(lv, s2080c2f0, ABISELECT(48,32), "S2080C2.s2080c2f0");
    check_field_offset(lv, s2080c2f1, ABISELECT(56,36), "S2080C2.s2080c2f1");
    test_class_info(&lv, &cd_S2080C2);
    dp->~S2080C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2080C2(Test_S2080C2, "S2080C2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7S2080C2C1Ev();
extern void _ZN7S2080C2D1Ev();
Name_Map name_map_S2080C2[] = {
  NSPAIR(_ZN7S2080C2C1Ev),
  NSPAIR(_ZN7S2080C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2080C4;
extern VTBL_ENTRY _ZTI7S2080C4[];
extern  VTBL_ENTRY _ZTV7S2080C4[];
extern Class_Descriptor cd_S2080C3;
extern VTBL_ENTRY _ZTI7S2080C3[];
extern  VTBL_ENTRY _ZTV7S2080C3[];
static Base_Class bases_S2080C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2080C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2080C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2080C2[];
extern void _ZN7S2080C2D1Ev();
extern void _ZN7S2080C2D0Ev();
extern void _ZN7S2080C42v2Ev();
extern void _ZN7S2080C42v3Ev();
extern void _ZN7S2080C42v4Ev();
extern void _ZN7S2080C32v5Ev();
extern void _ZN7S2080C32v6Ev();
extern void _ZN7S2080C22v7Ev();
static  VTBL_ENTRY vtc_S2080C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2080C2[0]),
  (VTBL_ENTRY)&_ZN7S2080C2D1Ev,
  (VTBL_ENTRY)&_ZN7S2080C2D0Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2080C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2080C32v6Ev,
  (VTBL_ENTRY)&_ZN7S2080C22v7Ev,
};
extern VTBL_ENTRY _ZTI7S2080C2[];
extern  VTBL_ENTRY _ZTV7S2080C2[];
Class_Descriptor cd_S2080C2 = {  "S2080C2", // class name
  bases_S2080C2, 2,
  &(vtc_S2080C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7S2080C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2080C2),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2080C1  : S2080C2 {
  int s2080c1f0;
  void *s2080c1f1[2];
  virtual  ~S2080C1(); // _ZN7S2080C1D1Ev
  virtual void  v1(); // _ZN7S2080C12v1Ev
  S2080C1(); // tgen
};
//SIG(1 S2080C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 FC5{ m Fp Fi FC6{ m}} Fi[2] Fc} v5 v6 Fp} vd v7 Fp Fi} vd v1 Fi Fp[2]}


 S2080C1 ::~S2080C1(){ note_dtor("S2080C1", this);}
void  S2080C1 ::v1(){vfunc_called(this, "_ZN7S2080C12v1Ev");}
S2080C1 ::S2080C1(){ note_ctor("S2080C1", this);} // tgen

static void Test_S2080C1()
{
  extern Class_Descriptor cd_S2080C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,14)];
    init_test(&cd_S2080C1, buf);
    S2080C1 *dp, &lv = *(dp=new (buf) S2080C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,52), "sizeof(S2080C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2080C1)");
    check_base_class_offset(lv, (S2080C4*)(S2080C3*)(S2080C2*), 0, "S2080C1");
    check_base_class_offset(lv, (S2080C3*)(S2080C2*), 0, "S2080C1");
    check_base_class_offset(lv, (S2080C2*), 0, "S2080C1");
    check_field_offset(lv, s2080c1f0, ABISELECT(60,40), "S2080C1.s2080c1f0");
    check_field_offset(lv, s2080c1f1, ABISELECT(64,44), "S2080C1.s2080c1f1");
    test_class_info(&lv, &cd_S2080C1);
    dp->~S2080C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2080C1(Test_S2080C1, "S2080C1", ABISELECT(80,52));

#else // __cplusplus

extern void _ZN7S2080C1C1Ev();
extern void _ZN7S2080C1D1Ev();
Name_Map name_map_S2080C1[] = {
  NSPAIR(_ZN7S2080C1C1Ev),
  NSPAIR(_ZN7S2080C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2080C4;
extern VTBL_ENTRY _ZTI7S2080C4[];
extern  VTBL_ENTRY _ZTV7S2080C4[];
extern Class_Descriptor cd_S2080C3;
extern VTBL_ENTRY _ZTI7S2080C3[];
extern  VTBL_ENTRY _ZTV7S2080C3[];
extern Class_Descriptor cd_S2080C2;
extern VTBL_ENTRY _ZTI7S2080C2[];
extern  VTBL_ENTRY _ZTV7S2080C2[];
static Base_Class bases_S2080C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2080C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2080C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S2080C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2080C1[];
extern void _ZN7S2080C1D1Ev();
extern void _ZN7S2080C1D0Ev();
extern void _ZN7S2080C42v2Ev();
extern void _ZN7S2080C42v3Ev();
extern void _ZN7S2080C42v4Ev();
extern void _ZN7S2080C32v5Ev();
extern void _ZN7S2080C32v6Ev();
extern void _ZN7S2080C22v7Ev();
extern void _ZN7S2080C12v1Ev();
static  VTBL_ENTRY vtc_S2080C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2080C1[0]),
  (VTBL_ENTRY)&_ZN7S2080C1D1Ev,
  (VTBL_ENTRY)&_ZN7S2080C1D0Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2080C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2080C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2080C32v6Ev,
  (VTBL_ENTRY)&_ZN7S2080C22v7Ev,
  (VTBL_ENTRY)&_ZN7S2080C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S2080C1[];
extern  VTBL_ENTRY _ZTV7S2080C1[];
Class_Descriptor cd_S2080C1 = {  "S2080C1", // class name
  bases_S2080C1, 3,
  &(vtc_S2080C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,52), // object size
  NSPAIRA(_ZTI7S2080C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2080C1),11, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9870C3_nt  {
  void *s9870c3f0;
  char s9870c3f1;
  void  mf9870c3(); // _ZN10S9870C3_nt8mf9870c3Ev
};
//SIG(-1 S9870C3_nt) C1{ m Fp Fc}


void  S9870C3_nt ::mf9870c3(){}

//skip512 S9870C3_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9870C2_nt  {
  ::S9870C3_nt s9870c2f0;
  virtual  ~S9870C2_nt(); // _ZN10S9870C2_ntD1Ev
  virtual void  v5(); // _ZN10S9870C2_nt2v5Ev
  virtual void  v6(); // _ZN10S9870C2_nt2v6Ev
  virtual void  v7(); // _ZN10S9870C2_nt2v7Ev
  virtual void  v8(); // _ZN10S9870C2_nt2v8Ev
  S9870C2_nt(); // tgen
};
//SIG(-1 S9870C2_nt) C1{ vd v1 v2 v3 v4 FC2{ m Fp Fc}}


 S9870C2_nt ::~S9870C2_nt(){ note_dtor("S9870C2_nt", this);}
void  S9870C2_nt ::v5(){vfunc_called(this, "_ZN10S9870C2_nt2v5Ev");}
void  S9870C2_nt ::v6(){vfunc_called(this, "_ZN10S9870C2_nt2v6Ev");}
void  S9870C2_nt ::v7(){vfunc_called(this, "_ZN10S9870C2_nt2v7Ev");}
void  S9870C2_nt ::v8(){vfunc_called(this, "_ZN10S9870C2_nt2v8Ev");}
S9870C2_nt ::S9870C2_nt(){ note_ctor("S9870C2_nt", this);} // tgen

//skip512 S9870C2_nt

#else // __cplusplus

extern void _ZN10S9870C2_ntC1Ev();
extern void _ZN10S9870C2_ntD1Ev();
Name_Map name_map_S9870C2_nt[] = {
  NSPAIR(_ZN10S9870C2_ntC1Ev),
  NSPAIR(_ZN10S9870C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S9870C2_nt[];
extern void _ZN10S9870C2_ntD1Ev();
extern void _ZN10S9870C2_ntD0Ev();
extern void _ZN10S9870C2_nt2v5Ev();
extern void _ZN10S9870C2_nt2v6Ev();
extern void _ZN10S9870C2_nt2v7Ev();
extern void _ZN10S9870C2_nt2v8Ev();
static  VTBL_ENTRY vtc_S9870C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S9870C2_nt[0]),
  (VTBL_ENTRY)&_ZN10S9870C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v7Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v8Ev,
};
extern VTBL_ENTRY _ZTI10S9870C2_nt[];
VTBL_ENTRY *P__ZTI10S9870C2_nt = _ZTI10S9870C2_nt; 
extern  VTBL_ENTRY _ZTV10S9870C2_nt[];
Class_Descriptor cd_S9870C2_nt = {  "S9870C2_nt", // class name
  0,0,//no base classes
  &(vtc_S9870C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,12), // object size
  NSPAIRA(_ZTI10S9870C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV10S9870C2_nt),8, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9870C5_nt  {
  ::S9870C3_nt s9870c5f0;
  void *s9870c5f1[2];
  void  mf9870c5(); // _ZN10S9870C5_nt8mf9870c5Ev
};
//SIG(-1 S9870C5_nt) C1{ m FC2{ m Fp Fc} Fp[2]}


void  S9870C5_nt ::mf9870c5(){}

//skip512 S9870C5_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9870C4_nt  {
  ::S9870C5_nt s9870c4f0;
  int s9870c4f1;
  void  mf9870c4(); // _ZN10S9870C4_nt8mf9870c4Ev
};
//SIG(-1 S9870C4_nt) C1{ m FC2{ m FC3{ m Fp Fc} Fp[2]} Fi}


void  S9870C4_nt ::mf9870c4(){}

//skip512 S9870C4_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9870C1  : S9870C2_nt {
  ::S9870C4_nt s9870c1f0;
  char s9870c1f1[2];
  virtual  ~S9870C1(); // _ZN7S9870C1D1Ev
  virtual void  v1(); // _ZN7S9870C12v1Ev
  virtual void  v2(); // _ZN7S9870C12v2Ev
  virtual void  v3(); // _ZN7S9870C12v3Ev
  virtual void  v4(); // _ZN7S9870C12v4Ev
  S9870C1(); // tgen
};
//SIG(1 S9870C1) C1{ BC2{ vd v5 v6 v7 v8 FC3{ m Fp Fc}} vd v1 v2 v3 v4 FC4{ m FC5{ m FC3 Fp[2]} Fi} Fc[2]}


 S9870C1 ::~S9870C1(){ note_dtor("S9870C1", this);}
void  S9870C1 ::v1(){vfunc_called(this, "_ZN7S9870C12v1Ev");}
void  S9870C1 ::v2(){vfunc_called(this, "_ZN7S9870C12v2Ev");}
void  S9870C1 ::v3(){vfunc_called(this, "_ZN7S9870C12v3Ev");}
void  S9870C1 ::v4(){vfunc_called(this, "_ZN7S9870C12v4Ev");}
S9870C1 ::S9870C1(){ note_ctor("S9870C1", this);} // tgen

static void Test_S9870C1()
{
  extern Class_Descriptor cd_S9870C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[10];
    init_test(&cd_S9870C1, buf);
    S9870C1 *dp, &lv = *(dp=new (buf) S9870C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,36), "sizeof(S9870C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9870C1)");
    check_base_class_offset(lv, (S9870C2_nt*), 0, "S9870C1");
    check_field_offset(lv, s9870c1f0, ABISELECT(24,12), "S9870C1.s9870c1f0");
    check_field_offset(lv, s9870c1f1, ABISELECT(64,32), "S9870C1.s9870c1f1");
    test_class_info(&lv, &cd_S9870C1);
    dp->~S9870C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9870C1(Test_S9870C1, "S9870C1", ABISELECT(72,36));

#else // __cplusplus

extern void _ZN7S9870C1C1Ev();
extern void _ZN7S9870C1D1Ev();
Name_Map name_map_S9870C1[] = {
  NSPAIR(_ZN7S9870C1C1Ev),
  NSPAIR(_ZN7S9870C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9870C2_nt;
extern VTBL_ENTRY _ZTI10S9870C2_nt[];
extern  VTBL_ENTRY _ZTV10S9870C2_nt[];
static Base_Class bases_S9870C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9870C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9870C1[];
extern void _ZN7S9870C1D1Ev();
extern void _ZN7S9870C1D0Ev();
extern void _ZN10S9870C2_nt2v5Ev();
extern void _ZN10S9870C2_nt2v6Ev();
extern void _ZN10S9870C2_nt2v7Ev();
extern void _ZN10S9870C2_nt2v8Ev();
extern void _ZN7S9870C12v1Ev();
extern void _ZN7S9870C12v2Ev();
extern void _ZN7S9870C12v3Ev();
extern void _ZN7S9870C12v4Ev();
static  VTBL_ENTRY vtc_S9870C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9870C1[0]),
  (VTBL_ENTRY)&_ZN7S9870C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9870C1D0Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v7Ev,
  (VTBL_ENTRY)&_ZN10S9870C2_nt2v8Ev,
  (VTBL_ENTRY)&_ZN7S9870C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9870C12v2Ev,
  (VTBL_ENTRY)&_ZN7S9870C12v3Ev,
  (VTBL_ENTRY)&_ZN7S9870C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S9870C1[];
extern  VTBL_ENTRY _ZTV7S9870C1[];
Class_Descriptor cd_S9870C1 = {  "S9870C1", // class name
  bases_S9870C1, 1,
  &(vtc_S9870C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,36), // object size
  NSPAIRA(_ZTI7S9870C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9870C1),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9360C2  {
  ::S10103C14_nt s9360c2f0;
  int s9360c2f1[2];
  char s9360c2f2;
  virtual  ~S9360C2(); // _ZN7S9360C2D1Ev
  virtual void  v3(); // _ZN7S9360C22v3Ev
  virtual void  v4(); // _ZN7S9360C22v4Ev
  virtual void  v5(); // _ZN7S9360C22v5Ev
  S9360C2(); // tgen
};
//SIG(-1 S9360C2) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S9360C2 ::~S9360C2(){ note_dtor("S9360C2", this);}
void  S9360C2 ::v3(){vfunc_called(this, "_ZN7S9360C22v3Ev");}
void  S9360C2 ::v4(){vfunc_called(this, "_ZN7S9360C22v4Ev");}
void  S9360C2 ::v5(){vfunc_called(this, "_ZN7S9360C22v5Ev");}
S9360C2 ::S9360C2(){ note_ctor("S9360C2", this);} // tgen

static void Test_S9360C2()
{
  extern Class_Descriptor cd_S9360C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S9360C2, buf);
    S9360C2 *dp, &lv = *(dp=new (buf) S9360C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S9360C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9360C2)");
    check_field_offset(lv, s9360c2f0, ABISELECT(8,4), "S9360C2.s9360c2f0");
    check_field_offset(lv, s9360c2f1, ABISELECT(24,16), "S9360C2.s9360c2f1");
    check_field_offset(lv, s9360c2f2, ABISELECT(32,24), "S9360C2.s9360c2f2");
    test_class_info(&lv, &cd_S9360C2);
    dp->~S9360C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9360C2(Test_S9360C2, "S9360C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S9360C2C1Ev();
extern void _ZN7S9360C2D1Ev();
Name_Map name_map_S9360C2[] = {
  NSPAIR(_ZN7S9360C2C1Ev),
  NSPAIR(_ZN7S9360C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9360C2[];
extern void _ZN7S9360C2D1Ev();
extern void _ZN7S9360C2D0Ev();
extern void _ZN7S9360C22v3Ev();
extern void _ZN7S9360C22v4Ev();
extern void _ZN7S9360C22v5Ev();
static  VTBL_ENTRY vtc_S9360C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9360C2[0]),
  (VTBL_ENTRY)&_ZN7S9360C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9360C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9360C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9360C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9360C22v5Ev,
};
extern VTBL_ENTRY _ZTI7S9360C2[];
extern  VTBL_ENTRY _ZTV7S9360C2[];
Class_Descriptor cd_S9360C2 = {  "S9360C2", // class name
  0,0,//no base classes
  &(vtc_S9360C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S9360C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9360C2),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9360C5  {
  void *s9360c5f0;
  __tsi64 s9360c5f1;
  void *s9360c5f2;
  int s9360c5f3[6];
  ::S10103C14_nt s9360c5f4;
};
//SIG(-1 S9360C5) C1{ Fp FL Fp Fi[6] FC2{ m Fp Fi FC3{ m}}}



static void Test_S9360C5()
{
  {
    init_simple_test("S9360C5");
    S9360C5 lv;
    check2(sizeof(lv), ABISELECT(64,52), "sizeof(S9360C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9360C5)");
    check_field_offset(lv, s9360c5f0, 0, "S9360C5.s9360c5f0");
    check_field_offset(lv, s9360c5f1, ABISELECT(8,4), "S9360C5.s9360c5f1");
    check_field_offset(lv, s9360c5f2, ABISELECT(16,12), "S9360C5.s9360c5f2");
    check_field_offset(lv, s9360c5f3, ABISELECT(24,16), "S9360C5.s9360c5f3");
    check_field_offset(lv, s9360c5f4, ABISELECT(48,40), "S9360C5.s9360c5f4");
  }
}
static Arrange_To_Call_Me vS9360C5(Test_S9360C5, "S9360C5", ABISELECT(64,52));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9360C1  : S9360C2 {
  void *s9360c1f0;
  ::S9360C5 s9360c1f1;
  void *s9360c1f2[2];
  virtual  ~S9360C1(); // _ZN7S9360C1D1Ev
  virtual void  v1(); // _ZN7S9360C12v1Ev
  virtual void  v2(); // _ZN7S9360C12v2Ev
  S9360C1(); // tgen
};
//SIG(1 S9360C1) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fp FC5{ Fp FL Fp Fi[6] FC3} Fp[2]}


 S9360C1 ::~S9360C1(){ note_dtor("S9360C1", this);}
void  S9360C1 ::v1(){vfunc_called(this, "_ZN7S9360C12v1Ev");}
void  S9360C1 ::v2(){vfunc_called(this, "_ZN7S9360C12v2Ev");}
S9360C1 ::S9360C1(){ note_ctor("S9360C1", this);} // tgen

static void Test_S9360C1()
{
  extern Class_Descriptor cd_S9360C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(17,24)];
    init_test(&cd_S9360C1, buf);
    S9360C1 *dp, &lv = *(dp=new (buf) S9360C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(128,92), "sizeof(S9360C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9360C1)");
    check_base_class_offset(lv, (S9360C2*), 0, "S9360C1");
    check_field_offset(lv, s9360c1f0, ABISELECT(40,28), "S9360C1.s9360c1f0");
    check_field_offset(lv, s9360c1f1, ABISELECT(48,32), "S9360C1.s9360c1f1");
    check_field_offset(lv, s9360c1f2, ABISELECT(112,84), "S9360C1.s9360c1f2");
    test_class_info(&lv, &cd_S9360C1);
    dp->~S9360C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9360C1(Test_S9360C1, "S9360C1", ABISELECT(128,92));

#else // __cplusplus

extern void _ZN7S9360C1C1Ev();
extern void _ZN7S9360C1D1Ev();
Name_Map name_map_S9360C1[] = {
  NSPAIR(_ZN7S9360C1C1Ev),
  NSPAIR(_ZN7S9360C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9360C2;
extern VTBL_ENTRY _ZTI7S9360C2[];
extern  VTBL_ENTRY _ZTV7S9360C2[];
static Base_Class bases_S9360C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9360C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9360C1[];
extern void _ZN7S9360C1D1Ev();
extern void _ZN7S9360C1D0Ev();
extern void _ZN7S9360C22v3Ev();
extern void _ZN7S9360C22v4Ev();
extern void _ZN7S9360C22v5Ev();
extern void _ZN7S9360C12v1Ev();
extern void _ZN7S9360C12v2Ev();
static  VTBL_ENTRY vtc_S9360C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9360C1[0]),
  (VTBL_ENTRY)&_ZN7S9360C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9360C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9360C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9360C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9360C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9360C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9360C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9360C1[];
extern  VTBL_ENTRY _ZTV7S9360C1[];
Class_Descriptor cd_S9360C1 = {  "S9360C1", // class name
  bases_S9360C1, 1,
  &(vtc_S9360C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(128,92), // object size
  NSPAIRA(_ZTI7S9360C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9360C1),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1142C4_nt  {
  void *s1142c4f0[4];
  void  mf1142c4(); // _ZN10S1142C4_nt8mf1142c4Ev
};
//SIG(-1 S1142C4_nt) C1{ m Fp[4]}


void  S1142C4_nt ::mf1142c4(){}

//skip512 S1142C4_nt

#else // __cplusplus

Class_Descriptor cd_S1142C4_nt = {  "S1142C4_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(32,16), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1142C5_nt  {
  int s1142c5f0[3];
  void  mf1142c5(); // _ZN10S1142C5_nt8mf1142c5Ev
};
//SIG(-1 S1142C5_nt) C1{ m Fi[3]}


void  S1142C5_nt ::mf1142c5(){}

//skip512 S1142C5_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1142C3  : S1142C4_nt {
  void *s1142c3f0[3];
  int s1142c3f1;
  ::S1142C5_nt s1142c3f2;
  ::S1142C5_nt s1142c3f3;
  ::S1142C5_nt s1142c3f4;
  ::S1142C5_nt s1142c3f5;
  ::S1142C5_nt s1142c3f6;
};
//SIG(-1 S1142C3) C1{ BC2{ m Fp[4]} Fp[3] Fi FC3{ m Fi[3]} FC3 FC3 FC3 FC3}



static void Test_S1142C3()
{
  extern Class_Descriptor cd_S1142C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(16,24)];
    init_test(&cd_S1142C3, buf);
    S1142C3 &lv = *(new (buf) S1142C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(120,92), "sizeof(S1142C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1142C3)");
    check_base_class_offset(lv, (S1142C4_nt*), 0, "S1142C3");
    check_field_offset(lv, s1142c3f0, ABISELECT(32,16), "S1142C3.s1142c3f0");
    check_field_offset(lv, s1142c3f1, ABISELECT(56,28), "S1142C3.s1142c3f1");
    check_field_offset(lv, s1142c3f2, ABISELECT(60,32), "S1142C3.s1142c3f2");
    check_field_offset(lv, s1142c3f3, ABISELECT(72,44), "S1142C3.s1142c3f3");
    check_field_offset(lv, s1142c3f4, ABISELECT(84,56), "S1142C3.s1142c3f4");
    check_field_offset(lv, s1142c3f5, ABISELECT(96,68), "S1142C3.s1142c3f5");
    check_field_offset(lv, s1142c3f6, ABISELECT(108,80), "S1142C3.s1142c3f6");
    test_class_info(&lv, &cd_S1142C3);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1142C3(Test_S1142C3, "S1142C3", ABISELECT(120,92));

#else // __cplusplus

extern Class_Descriptor cd_S1142C4_nt;
static Base_Class bases_S1142C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1142C4_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S1142C3 = {  "S1142C3", // class name
  bases_S1142C3, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(120,92), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1142C2  : S1142C3 {
  void *s1142c2f0;
  ::S1142C5_nt s1142c2f1;
  ::S1142C5_nt s1142c2f2;
  ::S1142C5_nt s1142c2f3;
  ::S1142C5_nt s1142c2f4;
};
//SIG(-1 S1142C2) C1{ BC2{ BC3{ m Fp[4]} Fp[3] Fi FC4{ m Fi[3]} FC4 FC4 FC4 FC4} Fp FC4 FC4 FC4 FC4}



static void Test_S1142C2()
{
  extern Class_Descriptor cd_S1142C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(23,37)];
    init_test(&cd_S1142C2, buf);
    S1142C2 &lv = *(new (buf) S1142C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(176,144), "sizeof(S1142C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1142C2)");
    check_base_class_offset(lv, (S1142C4_nt*)(S1142C3*), 0, "S1142C2");
    check_base_class_offset(lv, (S1142C3*), 0, "S1142C2");
    check_field_offset(lv, s1142c2f0, ABISELECT(120,92), "S1142C2.s1142c2f0");
    check_field_offset(lv, s1142c2f1, ABISELECT(128,96), "S1142C2.s1142c2f1");
    check_field_offset(lv, s1142c2f2, ABISELECT(140,108), "S1142C2.s1142c2f2");
    check_field_offset(lv, s1142c2f3, ABISELECT(152,120), "S1142C2.s1142c2f3");
    check_field_offset(lv, s1142c2f4, ABISELECT(164,132), "S1142C2.s1142c2f4");
    test_class_info(&lv, &cd_S1142C2);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1142C2(Test_S1142C2, "S1142C2", ABISELECT(176,144));

#else // __cplusplus

extern Class_Descriptor cd_S1142C4_nt;
extern Class_Descriptor cd_S1142C3;
static Base_Class bases_S1142C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1142C4_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1142C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S1142C2 = {  "S1142C2", // class name
  bases_S1142C2, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(176,144), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S1142C1  : S1142C2 {
  int s1142c1f0;
  ::S1142C5_nt s1142c1f1;
};
//SIG(1 S1142C1) C1{ BC2{ BC3{ BC4{ m Fp[4]} Fp[3] Fi FC5{ m Fi[3]} FC5 FC5 FC5 FC5} Fp FC5 FC5 FC5 FC5} Fi FC5}



static void Test_S1142C1()
{
  extern Class_Descriptor cd_S1142C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(25,41)];
    init_test(&cd_S1142C1, buf);
    S1142C1 &lv = *(new (buf) S1142C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(192,160), "sizeof(S1142C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S1142C1)");
    check_base_class_offset(lv, (S1142C4_nt*)(S1142C3*)(S1142C2*), 0, "S1142C1");
    check_base_class_offset(lv, (S1142C3*)(S1142C2*), 0, "S1142C1");
    check_base_class_offset(lv, (S1142C2*), 0, "S1142C1");
    check_field_offset(lv, s1142c1f0, ABISELECT(176,144), "S1142C1.s1142c1f0");
    check_field_offset(lv, s1142c1f1, ABISELECT(180,148), "S1142C1.s1142c1f1");
    test_class_info(&lv, &cd_S1142C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS1142C1(Test_S1142C1, "S1142C1", ABISELECT(192,160));

#else // __cplusplus

extern Class_Descriptor cd_S1142C4_nt;
extern Class_Descriptor cd_S1142C3;
extern Class_Descriptor cd_S1142C2;
static Base_Class bases_S1142C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S1142C4_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S1142C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S1142C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S1142C1 = {  "S1142C1", // class name
  bases_S1142C1, 3,
  0, // no vftv
  0, //no vtt
  ABISELECT(192,160), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9686C2  {
  ::S10103C14_nt s9686c2f0;
  int s9686c2f1[2];
  char s9686c2f2;
  virtual  ~S9686C2(); // _ZN7S9686C2D1Ev
  virtual void  v4(); // _ZN7S9686C22v4Ev
  virtual void  v5(); // _ZN7S9686C22v5Ev
  virtual void  v6(); // _ZN7S9686C22v6Ev
  S9686C2(); // tgen
};
//SIG(-1 S9686C2) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S9686C2 ::~S9686C2(){ note_dtor("S9686C2", this);}
void  S9686C2 ::v4(){vfunc_called(this, "_ZN7S9686C22v4Ev");}
void  S9686C2 ::v5(){vfunc_called(this, "_ZN7S9686C22v5Ev");}
void  S9686C2 ::v6(){vfunc_called(this, "_ZN7S9686C22v6Ev");}
S9686C2 ::S9686C2(){ note_ctor("S9686C2", this);} // tgen

static void Test_S9686C2()
{
  extern Class_Descriptor cd_S9686C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S9686C2, buf);
    S9686C2 *dp, &lv = *(dp=new (buf) S9686C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S9686C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9686C2)");
    check_field_offset(lv, s9686c2f0, ABISELECT(8,4), "S9686C2.s9686c2f0");
    check_field_offset(lv, s9686c2f1, ABISELECT(24,16), "S9686C2.s9686c2f1");
    check_field_offset(lv, s9686c2f2, ABISELECT(32,24), "S9686C2.s9686c2f2");
    test_class_info(&lv, &cd_S9686C2);
    dp->~S9686C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9686C2(Test_S9686C2, "S9686C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S9686C2C1Ev();
extern void _ZN7S9686C2D1Ev();
Name_Map name_map_S9686C2[] = {
  NSPAIR(_ZN7S9686C2C1Ev),
  NSPAIR(_ZN7S9686C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9686C2[];
extern void _ZN7S9686C2D1Ev();
extern void _ZN7S9686C2D0Ev();
extern void _ZN7S9686C22v4Ev();
extern void _ZN7S9686C22v5Ev();
extern void _ZN7S9686C22v6Ev();
static  VTBL_ENTRY vtc_S9686C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9686C2[0]),
  (VTBL_ENTRY)&_ZN7S9686C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9686C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9686C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9686C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9686C22v6Ev,
};
extern VTBL_ENTRY _ZTI7S9686C2[];
extern  VTBL_ENTRY _ZTV7S9686C2[];
Class_Descriptor cd_S9686C2 = {  "S9686C2", // class name
  0,0,//no base classes
  &(vtc_S9686C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S9686C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9686C2),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9686C1  : S9686C2 {
  void *s9686c1f0;
  ::S10103C14_nt s9686c1f1;
  ::S10102C22_nt s9686c1f2;
  virtual  ~S9686C1(); // _ZN7S9686C1D1Ev
  virtual void  v1(); // _ZN7S9686C12v1Ev
  virtual void  v2(); // _ZN7S9686C12v2Ev
  virtual void  v3(); // _ZN7S9686C12v3Ev
  S9686C1(); // tgen
};
//SIG(1 S9686C1) C1{ BC2{ vd v4 v5 v6 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 v3 Fp FC3 FC5{ m FC6{ Fl[4]}}}


 S9686C1 ::~S9686C1(){ note_dtor("S9686C1", this);}
void  S9686C1 ::v1(){vfunc_called(this, "_ZN7S9686C12v1Ev");}
void  S9686C1 ::v2(){vfunc_called(this, "_ZN7S9686C12v2Ev");}
void  S9686C1 ::v3(){vfunc_called(this, "_ZN7S9686C12v3Ev");}
S9686C1 ::S9686C1(){ note_ctor("S9686C1", this);} // tgen

static void Test_S9686C1()
{
  extern Class_Descriptor cd_S9686C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,16)];
    init_test(&cd_S9686C1, buf);
    S9686C1 *dp, &lv = *(dp=new (buf) S9686C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,60), "sizeof(S9686C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9686C1)");
    check_base_class_offset(lv, (S9686C2*), 0, "S9686C1");
    check_field_offset(lv, s9686c1f0, ABISELECT(40,28), "S9686C1.s9686c1f0");
    check_field_offset(lv, s9686c1f1, ABISELECT(48,32), "S9686C1.s9686c1f1");
    check_field_offset(lv, s9686c1f2, ABISELECT(64,44), "S9686C1.s9686c1f2");
    test_class_info(&lv, &cd_S9686C1);
    dp->~S9686C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9686C1(Test_S9686C1, "S9686C1", ABISELECT(96,60));

#else // __cplusplus

extern void _ZN7S9686C1C1Ev();
extern void _ZN7S9686C1D1Ev();
Name_Map name_map_S9686C1[] = {
  NSPAIR(_ZN7S9686C1C1Ev),
  NSPAIR(_ZN7S9686C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9686C2;
extern VTBL_ENTRY _ZTI7S9686C2[];
extern  VTBL_ENTRY _ZTV7S9686C2[];
static Base_Class bases_S9686C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9686C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9686C1[];
extern void _ZN7S9686C1D1Ev();
extern void _ZN7S9686C1D0Ev();
extern void _ZN7S9686C22v4Ev();
extern void _ZN7S9686C22v5Ev();
extern void _ZN7S9686C22v6Ev();
extern void _ZN7S9686C12v1Ev();
extern void _ZN7S9686C12v2Ev();
extern void _ZN7S9686C12v3Ev();
static  VTBL_ENTRY vtc_S9686C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9686C1[0]),
  (VTBL_ENTRY)&_ZN7S9686C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9686C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9686C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9686C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9686C22v6Ev,
  (VTBL_ENTRY)&_ZN7S9686C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9686C12v2Ev,
  (VTBL_ENTRY)&_ZN7S9686C12v3Ev,
};
extern VTBL_ENTRY _ZTI7S9686C1[];
extern  VTBL_ENTRY _ZTV7S9686C1[];
Class_Descriptor cd_S9686C1 = {  "S9686C1", // class name
  bases_S9686C1, 1,
  &(vtc_S9686C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(96,60), // object size
  NSPAIRA(_ZTI7S9686C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9686C1),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4424C3  {
  ::S10103C14_nt s4424c3f0;
  int s4424c3f1[2];
  char s4424c3f2;
  virtual  ~S4424C3(); // _ZN7S4424C3D1Ev
  virtual void  v2(); // _ZN7S4424C32v2Ev
  virtual void  v3(); // _ZN7S4424C32v3Ev
  virtual void  v4(); // _ZN7S4424C32v4Ev
  S4424C3(); // tgen
};
//SIG(-1 S4424C3) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S4424C3 ::~S4424C3(){ note_dtor("S4424C3", this);}
void  S4424C3 ::v2(){vfunc_called(this, "_ZN7S4424C32v2Ev");}
void  S4424C3 ::v3(){vfunc_called(this, "_ZN7S4424C32v3Ev");}
void  S4424C3 ::v4(){vfunc_called(this, "_ZN7S4424C32v4Ev");}
S4424C3 ::S4424C3(){ note_ctor("S4424C3", this);} // tgen

static void Test_S4424C3()
{
  extern Class_Descriptor cd_S4424C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S4424C3, buf);
    S4424C3 *dp, &lv = *(dp=new (buf) S4424C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S4424C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4424C3)");
    check_field_offset(lv, s4424c3f0, ABISELECT(8,4), "S4424C3.s4424c3f0");
    check_field_offset(lv, s4424c3f1, ABISELECT(24,16), "S4424C3.s4424c3f1");
    check_field_offset(lv, s4424c3f2, ABISELECT(32,24), "S4424C3.s4424c3f2");
    test_class_info(&lv, &cd_S4424C3);
    dp->~S4424C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4424C3(Test_S4424C3, "S4424C3", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S4424C3C1Ev();
extern void _ZN7S4424C3D1Ev();
Name_Map name_map_S4424C3[] = {
  NSPAIR(_ZN7S4424C3C1Ev),
  NSPAIR(_ZN7S4424C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S4424C3[];
extern void _ZN7S4424C3D1Ev();
extern void _ZN7S4424C3D0Ev();
extern void _ZN7S4424C32v2Ev();
extern void _ZN7S4424C32v3Ev();
extern void _ZN7S4424C32v4Ev();
static  VTBL_ENTRY vtc_S4424C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4424C3[0]),
  (VTBL_ENTRY)&_ZN7S4424C3D1Ev,
  (VTBL_ENTRY)&_ZN7S4424C3D0Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v3Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v4Ev,
};
extern VTBL_ENTRY _ZTI7S4424C3[];
extern  VTBL_ENTRY _ZTV7S4424C3[];
Class_Descriptor cd_S4424C3 = {  "S4424C3", // class name
  0,0,//no base classes
  &(vtc_S4424C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S4424C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S4424C3),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4424C2  : S4424C3 {
  int s4424c2f0[2];
  void *s4424c2f1[2];
  virtual  ~S4424C2(); // _ZN7S4424C2D1Ev
  virtual void  v5(); // _ZN7S4424C22v5Ev
  virtual void  v6(); // _ZN7S4424C22v6Ev
  S4424C2(); // tgen
};
//SIG(-1 S4424C2) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fi[2] Fp[2]}


 S4424C2 ::~S4424C2(){ note_dtor("S4424C2", this);}
void  S4424C2 ::v5(){vfunc_called(this, "_ZN7S4424C22v5Ev");}
void  S4424C2 ::v6(){vfunc_called(this, "_ZN7S4424C22v6Ev");}
S4424C2 ::S4424C2(){ note_ctor("S4424C2", this);} // tgen

static void Test_S4424C2()
{
  extern Class_Descriptor cd_S4424C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_S4424C2, buf);
    S4424C2 *dp, &lv = *(dp=new (buf) S4424C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(S4424C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4424C2)");
    check_base_class_offset(lv, (S4424C3*), 0, "S4424C2");
    check_field_offset(lv, s4424c2f0, ABISELECT(36,28), "S4424C2.s4424c2f0");
    check_field_offset(lv, s4424c2f1, ABISELECT(48,36), "S4424C2.s4424c2f1");
    test_class_info(&lv, &cd_S4424C2);
    dp->~S4424C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4424C2(Test_S4424C2, "S4424C2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7S4424C2C1Ev();
extern void _ZN7S4424C2D1Ev();
Name_Map name_map_S4424C2[] = {
  NSPAIR(_ZN7S4424C2C1Ev),
  NSPAIR(_ZN7S4424C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4424C3;
extern VTBL_ENTRY _ZTI7S4424C3[];
extern  VTBL_ENTRY _ZTV7S4424C3[];
static Base_Class bases_S4424C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4424C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4424C2[];
extern void _ZN7S4424C2D1Ev();
extern void _ZN7S4424C2D0Ev();
extern void _ZN7S4424C32v2Ev();
extern void _ZN7S4424C32v3Ev();
extern void _ZN7S4424C32v4Ev();
extern void _ZN7S4424C22v5Ev();
extern void _ZN7S4424C22v6Ev();
static  VTBL_ENTRY vtc_S4424C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4424C2[0]),
  (VTBL_ENTRY)&_ZN7S4424C2D1Ev,
  (VTBL_ENTRY)&_ZN7S4424C2D0Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v3Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v4Ev,
  (VTBL_ENTRY)&_ZN7S4424C22v5Ev,
  (VTBL_ENTRY)&_ZN7S4424C22v6Ev,
};
extern VTBL_ENTRY _ZTI7S4424C2[];
extern  VTBL_ENTRY _ZTV7S4424C2[];
Class_Descriptor cd_S4424C2 = {  "S4424C2", // class name
  bases_S4424C2, 1,
  &(vtc_S4424C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7S4424C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4424C2),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4424C1  : S4424C2 {
  void *s4424c1f0;
  int s4424c1f1;
  virtual  ~S4424C1(); // _ZN7S4424C1D1Ev
  virtual void  v1(); // _ZN7S4424C12v1Ev
  S4424C1(); // tgen
};
//SIG(1 S4424C1) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} vd v5 v6 Fi[2] Fp[2]} vd v1 Fp Fi}


 S4424C1 ::~S4424C1(){ note_dtor("S4424C1", this);}
void  S4424C1 ::v1(){vfunc_called(this, "_ZN7S4424C12v1Ev");}
S4424C1 ::S4424C1(){ note_ctor("S4424C1", this);} // tgen

static void Test_S4424C1()
{
  extern Class_Descriptor cd_S4424C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,14)];
    init_test(&cd_S4424C1, buf);
    S4424C1 *dp, &lv = *(dp=new (buf) S4424C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,52), "sizeof(S4424C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4424C1)");
    check_base_class_offset(lv, (S4424C3*)(S4424C2*), 0, "S4424C1");
    check_base_class_offset(lv, (S4424C2*), 0, "S4424C1");
    check_field_offset(lv, s4424c1f0, ABISELECT(64,44), "S4424C1.s4424c1f0");
    check_field_offset(lv, s4424c1f1, ABISELECT(72,48), "S4424C1.s4424c1f1");
    test_class_info(&lv, &cd_S4424C1);
    dp->~S4424C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4424C1(Test_S4424C1, "S4424C1", ABISELECT(80,52));

#else // __cplusplus

extern void _ZN7S4424C1C1Ev();
extern void _ZN7S4424C1D1Ev();
Name_Map name_map_S4424C1[] = {
  NSPAIR(_ZN7S4424C1C1Ev),
  NSPAIR(_ZN7S4424C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4424C3;
extern VTBL_ENTRY _ZTI7S4424C3[];
extern  VTBL_ENTRY _ZTV7S4424C3[];
extern Class_Descriptor cd_S4424C2;
extern VTBL_ENTRY _ZTI7S4424C2[];
extern  VTBL_ENTRY _ZTV7S4424C2[];
static Base_Class bases_S4424C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4424C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S4424C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4424C1[];
extern void _ZN7S4424C1D1Ev();
extern void _ZN7S4424C1D0Ev();
extern void _ZN7S4424C32v2Ev();
extern void _ZN7S4424C32v3Ev();
extern void _ZN7S4424C32v4Ev();
extern void _ZN7S4424C22v5Ev();
extern void _ZN7S4424C22v6Ev();
extern void _ZN7S4424C12v1Ev();
static  VTBL_ENTRY vtc_S4424C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4424C1[0]),
  (VTBL_ENTRY)&_ZN7S4424C1D1Ev,
  (VTBL_ENTRY)&_ZN7S4424C1D0Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v3Ev,
  (VTBL_ENTRY)&_ZN7S4424C32v4Ev,
  (VTBL_ENTRY)&_ZN7S4424C22v5Ev,
  (VTBL_ENTRY)&_ZN7S4424C22v6Ev,
  (VTBL_ENTRY)&_ZN7S4424C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S4424C1[];
extern  VTBL_ENTRY _ZTV7S4424C1[];
Class_Descriptor cd_S4424C1 = {  "S4424C1", // class name
  bases_S4424C1, 2,
  &(vtc_S4424C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,52), // object size
  NSPAIRA(_ZTI7S4424C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4424C1),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2082C4  {
  ::S10103C14_nt s2082c4f0;
  int s2082c4f1[2];
  char s2082c4f2;
  virtual  ~S2082C4(); // _ZN7S2082C4D1Ev
  virtual void  v2(); // _ZN7S2082C42v2Ev
  virtual void  v3(); // _ZN7S2082C42v3Ev
  virtual void  v4(); // _ZN7S2082C42v4Ev
  S2082C4(); // tgen
};
//SIG(-1 S2082C4) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S2082C4 ::~S2082C4(){ note_dtor("S2082C4", this);}
void  S2082C4 ::v2(){vfunc_called(this, "_ZN7S2082C42v2Ev");}
void  S2082C4 ::v3(){vfunc_called(this, "_ZN7S2082C42v3Ev");}
void  S2082C4 ::v4(){vfunc_called(this, "_ZN7S2082C42v4Ev");}
S2082C4 ::S2082C4(){ note_ctor("S2082C4", this);} // tgen

static void Test_S2082C4()
{
  extern Class_Descriptor cd_S2082C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2082C4, buf);
    S2082C4 *dp, &lv = *(dp=new (buf) S2082C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2082C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2082C4)");
    check_field_offset(lv, s2082c4f0, ABISELECT(8,4), "S2082C4.s2082c4f0");
    check_field_offset(lv, s2082c4f1, ABISELECT(24,16), "S2082C4.s2082c4f1");
    check_field_offset(lv, s2082c4f2, ABISELECT(32,24), "S2082C4.s2082c4f2");
    test_class_info(&lv, &cd_S2082C4);
    dp->~S2082C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2082C4(Test_S2082C4, "S2082C4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2082C4C1Ev();
extern void _ZN7S2082C4D1Ev();
Name_Map name_map_S2082C4[] = {
  NSPAIR(_ZN7S2082C4C1Ev),
  NSPAIR(_ZN7S2082C4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S2082C4[];
extern void _ZN7S2082C4D1Ev();
extern void _ZN7S2082C4D0Ev();
extern void _ZN7S2082C42v2Ev();
extern void _ZN7S2082C42v3Ev();
extern void _ZN7S2082C42v4Ev();
static  VTBL_ENTRY vtc_S2082C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2082C4[0]),
  (VTBL_ENTRY)&_ZN7S2082C4D1Ev,
  (VTBL_ENTRY)&_ZN7S2082C4D0Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v4Ev,
};
extern VTBL_ENTRY _ZTI7S2082C4[];
extern  VTBL_ENTRY _ZTV7S2082C4[];
Class_Descriptor cd_S2082C4 = {  "S2082C4", // class name
  0,0,//no base classes
  &(vtc_S2082C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2082C4),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S2082C4),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2082C3  : S2082C4 {
  void *s2082c3f0;
  virtual void  v5(); // _ZN7S2082C32v5Ev
  virtual void  v6(); // _ZN7S2082C32v6Ev
  ~S2082C3(); // tgen
  S2082C3(); // tgen
};
//SIG(-1 S2082C3) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} v1 v2 Fp}


void  S2082C3 ::v5(){vfunc_called(this, "_ZN7S2082C32v5Ev");}
void  S2082C3 ::v6(){vfunc_called(this, "_ZN7S2082C32v6Ev");}
S2082C3 ::~S2082C3(){ note_dtor("S2082C3", this);} // tgen
S2082C3 ::S2082C3(){ note_ctor("S2082C3", this);} // tgen

static void Test_S2082C3()
{
  extern Class_Descriptor cd_S2082C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_S2082C3, buf);
    S2082C3 *dp, &lv = *(dp=new (buf) S2082C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(S2082C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2082C3)");
    check_base_class_offset(lv, (S2082C4*), 0, "S2082C3");
    check_field_offset(lv, s2082c3f0, ABISELECT(40,28), "S2082C3.s2082c3f0");
    test_class_info(&lv, &cd_S2082C3);
    dp->~S2082C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2082C3(Test_S2082C3, "S2082C3", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7S2082C3C1Ev();
extern void _ZN7S2082C3D1Ev();
Name_Map name_map_S2082C3[] = {
  NSPAIR(_ZN7S2082C3C1Ev),
  NSPAIR(_ZN7S2082C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2082C4;
extern VTBL_ENTRY _ZTI7S2082C4[];
extern  VTBL_ENTRY _ZTV7S2082C4[];
static Base_Class bases_S2082C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2082C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2082C3[];
extern void _ZN7S2082C3D1Ev();
extern void _ZN7S2082C3D0Ev();
extern void _ZN7S2082C42v2Ev();
extern void _ZN7S2082C42v3Ev();
extern void _ZN7S2082C42v4Ev();
extern void _ZN7S2082C32v5Ev();
extern void _ZN7S2082C32v6Ev();
static  VTBL_ENTRY vtc_S2082C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2082C3[0]),
  (VTBL_ENTRY)&_ZN7S2082C3D1Ev,
  (VTBL_ENTRY)&_ZN7S2082C3D0Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2082C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2082C32v6Ev,
};
extern VTBL_ENTRY _ZTI7S2082C3[];
extern  VTBL_ENTRY _ZTV7S2082C3[];
Class_Descriptor cd_S2082C3 = {  "S2082C3", // class name
  bases_S2082C3, 1,
  &(vtc_S2082C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7S2082C3),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2082C3),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2082C2  : S2082C3 {
  void *s2082c2f0;
  int s2082c2f1;
  virtual  ~S2082C2(); // _ZN7S2082C2D1Ev
  virtual void  v7(); // _ZN7S2082C22v7Ev
  S2082C2(); // tgen
};
//SIG(-1 S2082C2) C1{ BC2{ BC3{ vd v2 v3 v4 FC4{ m Fp Fi FC5{ m}} Fi[2] Fc} v5 v6 Fp} vd v1 Fp Fi}


 S2082C2 ::~S2082C2(){ note_dtor("S2082C2", this);}
void  S2082C2 ::v7(){vfunc_called(this, "_ZN7S2082C22v7Ev");}
S2082C2 ::S2082C2(){ note_ctor("S2082C2", this);} // tgen

static void Test_S2082C2()
{
  extern Class_Descriptor cd_S2082C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S2082C2, buf);
    S2082C2 *dp, &lv = *(dp=new (buf) S2082C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S2082C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2082C2)");
    check_base_class_offset(lv, (S2082C4*)(S2082C3*), 0, "S2082C2");
    check_base_class_offset(lv, (S2082C3*), 0, "S2082C2");
    check_field_offset(lv, s2082c2f0, ABISELECT(48,32), "S2082C2.s2082c2f0");
    check_field_offset(lv, s2082c2f1, ABISELECT(56,36), "S2082C2.s2082c2f1");
    test_class_info(&lv, &cd_S2082C2);
    dp->~S2082C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2082C2(Test_S2082C2, "S2082C2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7S2082C2C1Ev();
extern void _ZN7S2082C2D1Ev();
Name_Map name_map_S2082C2[] = {
  NSPAIR(_ZN7S2082C2C1Ev),
  NSPAIR(_ZN7S2082C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2082C4;
extern VTBL_ENTRY _ZTI7S2082C4[];
extern  VTBL_ENTRY _ZTV7S2082C4[];
extern Class_Descriptor cd_S2082C3;
extern VTBL_ENTRY _ZTI7S2082C3[];
extern  VTBL_ENTRY _ZTV7S2082C3[];
static Base_Class bases_S2082C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2082C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2082C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2082C2[];
extern void _ZN7S2082C2D1Ev();
extern void _ZN7S2082C2D0Ev();
extern void _ZN7S2082C42v2Ev();
extern void _ZN7S2082C42v3Ev();
extern void _ZN7S2082C42v4Ev();
extern void _ZN7S2082C32v5Ev();
extern void _ZN7S2082C32v6Ev();
extern void _ZN7S2082C22v7Ev();
static  VTBL_ENTRY vtc_S2082C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2082C2[0]),
  (VTBL_ENTRY)&_ZN7S2082C2D1Ev,
  (VTBL_ENTRY)&_ZN7S2082C2D0Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2082C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2082C32v6Ev,
  (VTBL_ENTRY)&_ZN7S2082C22v7Ev,
};
extern VTBL_ENTRY _ZTI7S2082C2[];
extern  VTBL_ENTRY _ZTV7S2082C2[];
Class_Descriptor cd_S2082C2 = {  "S2082C2", // class name
  bases_S2082C2, 2,
  &(vtc_S2082C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7S2082C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2082C2),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2082C1  : S2082C2 {
  virtual  ~S2082C1(); // _ZN7S2082C1D1Ev
  virtual void  v1(); // _ZN7S2082C12v1Ev
  S2082C1(); // tgen
};
//SIG(1 S2082C1) C1{ BC2{ BC3{ BC4{ vd v2 v3 v4 FC5{ m Fp Fi FC6{ m}} Fi[2] Fc} v5 v6 Fp} vd v7 Fp Fi} vd v1}


 S2082C1 ::~S2082C1(){ note_dtor("S2082C1", this);}
void  S2082C1 ::v1(){vfunc_called(this, "_ZN7S2082C12v1Ev");}
S2082C1 ::S2082C1(){ note_ctor("S2082C1", this);} // tgen

static void Test_S2082C1()
{
  extern Class_Descriptor cd_S2082C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S2082C1, buf);
    S2082C1 *dp, &lv = *(dp=new (buf) S2082C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S2082C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2082C1)");
    check_base_class_offset(lv, (S2082C4*)(S2082C3*)(S2082C2*), 0, "S2082C1");
    check_base_class_offset(lv, (S2082C3*)(S2082C2*), 0, "S2082C1");
    check_base_class_offset(lv, (S2082C2*), 0, "S2082C1");
    test_class_info(&lv, &cd_S2082C1);
    dp->~S2082C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2082C1(Test_S2082C1, "S2082C1", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7S2082C1C1Ev();
extern void _ZN7S2082C1D1Ev();
Name_Map name_map_S2082C1[] = {
  NSPAIR(_ZN7S2082C1C1Ev),
  NSPAIR(_ZN7S2082C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2082C4;
extern VTBL_ENTRY _ZTI7S2082C4[];
extern  VTBL_ENTRY _ZTV7S2082C4[];
extern Class_Descriptor cd_S2082C3;
extern VTBL_ENTRY _ZTI7S2082C3[];
extern  VTBL_ENTRY _ZTV7S2082C3[];
extern Class_Descriptor cd_S2082C2;
extern VTBL_ENTRY _ZTI7S2082C2[];
extern  VTBL_ENTRY _ZTV7S2082C2[];
static Base_Class bases_S2082C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2082C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2082C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S2082C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2082C1[];
extern void _ZN7S2082C1D1Ev();
extern void _ZN7S2082C1D0Ev();
extern void _ZN7S2082C42v2Ev();
extern void _ZN7S2082C42v3Ev();
extern void _ZN7S2082C42v4Ev();
extern void _ZN7S2082C32v5Ev();
extern void _ZN7S2082C32v6Ev();
extern void _ZN7S2082C22v7Ev();
extern void _ZN7S2082C12v1Ev();
static  VTBL_ENTRY vtc_S2082C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2082C1[0]),
  (VTBL_ENTRY)&_ZN7S2082C1D1Ev,
  (VTBL_ENTRY)&_ZN7S2082C1D0Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v2Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v3Ev,
  (VTBL_ENTRY)&_ZN7S2082C42v4Ev,
  (VTBL_ENTRY)&_ZN7S2082C32v5Ev,
  (VTBL_ENTRY)&_ZN7S2082C32v6Ev,
  (VTBL_ENTRY)&_ZN7S2082C22v7Ev,
  (VTBL_ENTRY)&_ZN7S2082C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S2082C1[];
extern  VTBL_ENTRY _ZTV7S2082C1[];
Class_Descriptor cd_S2082C1 = {  "S2082C1", // class name
  bases_S2082C1, 3,
  &(vtc_S2082C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7S2082C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2082C1),11, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

union  S11863C4  {
  int s11863c4f0;
  void *s11863c4f1;
  void *s11863c4f2;
};
//SIG(1 S11863C4) U1{ Fi Fp Fp}

#endif // __cplusplus
#ifdef __cplusplus

struct  S11863C3  {
  void *s11863c3f0;
  int s11863c3f1[2];
  ::S11863C4 s11863c3f2;
  short s11863c3f3;
  char s11863c3f4;
  char s11863c3f5;
  void *s11863c3f6;
  __tsi64 s11863c3f7;
  __tsi64 s11863c3f8;
};
//SIG(1 S11863C3) C1{ Fp Fi[2] FU2{ Fi Fp Fp} Fs Fc Fc Fp FL FL}



static void Test_S11863C3()
{
  {
    init_simple_test("S11863C3");
    S11863C3 lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(S11863C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11863C3)");
    check_field_offset(lv, s11863c3f0, 0, "S11863C3.s11863c3f0");
    check_field_offset(lv, s11863c3f1, ABISELECT(8,4), "S11863C3.s11863c3f1");
    check_field_offset(lv, s11863c3f2, ABISELECT(16,12), "S11863C3.s11863c3f2");
    check_field_offset(lv, s11863c3f3, ABISELECT(24,16), "S11863C3.s11863c3f3");
    check_field_offset(lv, s11863c3f4, ABISELECT(26,18), "S11863C3.s11863c3f4");
    check_field_offset(lv, s11863c3f5, ABISELECT(27,19), "S11863C3.s11863c3f5");
    check_field_offset(lv, s11863c3f6, ABISELECT(32,20), "S11863C3.s11863c3f6");
    check_field_offset(lv, s11863c3f7, ABISELECT(40,24), "S11863C3.s11863c3f7");
    check_field_offset(lv, s11863c3f8, ABISELECT(48,32), "S11863C3.s11863c3f8");
  }
}
static Arrange_To_Call_Me vS11863C3(Test_S11863C3, "S11863C3", ABISELECT(56,40));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11863C2  {
  void *s11863c2f0[2];
  __tsi64 s11863c2f1;
  char s11863c2f2;
  int s11863c2f3[2];
  void *s11863c2f4;
  ::S11863C3 s11863c2f5[8];
};
//SIG(-1 S11863C2) C1{ Fp[2] FL Fc Fi[2] Fp FC2{ Fp Fi[2] FU3{ Fi Fp Fp} Fs Fc Fc Fp FL FL}[8]}



static void Test_S11863C2()
{
  {
    init_simple_test("S11863C2");
    S11863C2 lv;
    check2(sizeof(lv), ABISELECT(496,352), "sizeof(S11863C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11863C2)");
    check_field_offset(lv, s11863c2f0, 0, "S11863C2.s11863c2f0");
    check_field_offset(lv, s11863c2f1, ABISELECT(16,8), "S11863C2.s11863c2f1");
    check_field_offset(lv, s11863c2f2, ABISELECT(24,16), "S11863C2.s11863c2f2");
    check_field_offset(lv, s11863c2f3, ABISELECT(28,20), "S11863C2.s11863c2f3");
    check_field_offset(lv, s11863c2f4, ABISELECT(40,28), "S11863C2.s11863c2f4");
    check_field_offset(lv, s11863c2f5, ABISELECT(48,32), "S11863C2.s11863c2f5");
  }
}
static Arrange_To_Call_Me vS11863C2(Test_S11863C2, "S11863C2", ABISELECT(496,352));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11863C1  {
  ::S11863C2 s11863c1f0;
  __tsi64 s11863c1f1;
};
//SIG(1 S11863C1) C1{ FC2{ Fp[2] FL Fc Fi[2] Fp FC3{ Fp Fi[2] FU4{ Fi Fp Fp} Fs Fc Fc Fp FL FL}[8]} FL}



static void Test_S11863C1()
{
  {
    init_simple_test("S11863C1");
    S11863C1 lv;
    check2(sizeof(lv), ABISELECT(504,360), "sizeof(S11863C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11863C1)");
    check_field_offset(lv, s11863c1f0, 0, "S11863C1.s11863c1f0");
    check_field_offset(lv, s11863c1f1, ABISELECT(496,352), "S11863C1.s11863c1f1");
  }
}
static Arrange_To_Call_Me vS11863C1(Test_S11863C1, "S11863C1", ABISELECT(504,360));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6887C2  {
  void *s6887c2f0;
  __tsi64 s6887c2f1;
  int s6887c2f2;
  char s6887c2f3[5];
  int s6887c2f4;
  virtual void  v5(); // _ZN7S6887C22v5Ev
  virtual void  v6(); // _ZN7S6887C22v6Ev
  virtual void  v7(); // _ZN7S6887C22v7Ev
  ~S6887C2(); // tgen
  S6887C2(); // tgen
};
//SIG(-1 S6887C2) C1{ v1 v2 v3 Fp FL Fi Fc[5] Fi}


void  S6887C2 ::v5(){vfunc_called(this, "_ZN7S6887C22v5Ev");}
void  S6887C2 ::v6(){vfunc_called(this, "_ZN7S6887C22v6Ev");}
void  S6887C2 ::v7(){vfunc_called(this, "_ZN7S6887C22v7Ev");}
S6887C2 ::~S6887C2(){ note_dtor("S6887C2", this);} // tgen
S6887C2 ::S6887C2(){ note_ctor("S6887C2", this);} // tgen

static void Test_S6887C2()
{
  extern Class_Descriptor cd_S6887C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_S6887C2, buf);
    S6887C2 *dp, &lv = *(dp=new (buf) S6887C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(S6887C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S6887C2)");
    check_field_offset(lv, s6887c2f0, ABISELECT(8,4), "S6887C2.s6887c2f0");
    check_field_offset(lv, s6887c2f1, ABISELECT(16,8), "S6887C2.s6887c2f1");
    check_field_offset(lv, s6887c2f2, ABISELECT(24,16), "S6887C2.s6887c2f2");
    check_field_offset(lv, s6887c2f3, ABISELECT(28,20), "S6887C2.s6887c2f3");
    check_field_offset(lv, s6887c2f4, ABISELECT(36,28), "S6887C2.s6887c2f4");
    test_class_info(&lv, &cd_S6887C2);
    dp->~S6887C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS6887C2(Test_S6887C2, "S6887C2", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7S6887C2C1Ev();
extern void _ZN7S6887C2D1Ev();
Name_Map name_map_S6887C2[] = {
  NSPAIR(_ZN7S6887C2C1Ev),
  NSPAIR(_ZN7S6887C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S6887C2[];
extern void _ZN7S6887C22v5Ev();
extern void _ZN7S6887C22v6Ev();
extern void _ZN7S6887C22v7Ev();
static  VTBL_ENTRY vtc_S6887C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S6887C2[0]),
  (VTBL_ENTRY)&_ZN7S6887C22v5Ev,
  (VTBL_ENTRY)&_ZN7S6887C22v6Ev,
  (VTBL_ENTRY)&_ZN7S6887C22v7Ev,
};
extern VTBL_ENTRY _ZTI7S6887C2[];
extern  VTBL_ENTRY _ZTV7S6887C2[];
Class_Descriptor cd_S6887C2 = {  "S6887C2", // class name
  0,0,//no base classes
  &(vtc_S6887C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7S6887C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S6887C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6887C3  {
  void *s6887c3f0[2];
  virtual void  v8(); // _ZN7S6887C32v8Ev
  virtual void  v9(); // _ZN7S6887C32v9Ev
  virtual void  v10(); // _ZN7S6887C33v10Ev
  ~S6887C3(); // tgen
  S6887C3(); // tgen
};
//SIG(-1 S6887C3) C1{ v1 v2 v3 Fp[2]}


void  S6887C3 ::v8(){vfunc_called(this, "_ZN7S6887C32v8Ev");}
void  S6887C3 ::v9(){vfunc_called(this, "_ZN7S6887C32v9Ev");}
void  S6887C3 ::v10(){vfunc_called(this, "_ZN7S6887C33v10Ev");}
S6887C3 ::~S6887C3(){ note_dtor("S6887C3", this);} // tgen
S6887C3 ::S6887C3(){ note_ctor("S6887C3", this);} // tgen

static void Test_S6887C3()
{
  extern Class_Descriptor cd_S6887C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[4];
    init_test(&cd_S6887C3, buf);
    S6887C3 *dp, &lv = *(dp=new (buf) S6887C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,12), "sizeof(S6887C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S6887C3)");
    check_field_offset(lv, s6887c3f0, ABISELECT(8,4), "S6887C3.s6887c3f0");
    test_class_info(&lv, &cd_S6887C3);
    dp->~S6887C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS6887C3(Test_S6887C3, "S6887C3", ABISELECT(24,12));

#else // __cplusplus

extern void _ZN7S6887C3C1Ev();
extern void _ZN7S6887C3D1Ev();
Name_Map name_map_S6887C3[] = {
  NSPAIR(_ZN7S6887C3C1Ev),
  NSPAIR(_ZN7S6887C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S6887C3[];
extern void _ZN7S6887C32v8Ev();
extern void _ZN7S6887C32v9Ev();
extern void _ZN7S6887C33v10Ev();
static  VTBL_ENTRY vtc_S6887C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S6887C3[0]),
  (VTBL_ENTRY)&_ZN7S6887C32v8Ev,
  (VTBL_ENTRY)&_ZN7S6887C32v9Ev,
  (VTBL_ENTRY)&_ZN7S6887C33v10Ev,
};
extern VTBL_ENTRY _ZTI7S6887C3[];
extern  VTBL_ENTRY _ZTV7S6887C3[];
Class_Descriptor cd_S6887C3 = {  "S6887C3", // class name
  0,0,//no base classes
  &(vtc_S6887C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,12), // object size
  NSPAIRA(_ZTI7S6887C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S6887C3),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6887C1  : S6887C2 , S6887C3 {
  ::S6887C2 s6887c1f0;
  ::S6887C2 s6887c1f1;
  ::S6887C2 s6887c1f2;
  virtual void  v1(); // _ZN7S6887C12v1Ev
  virtual void  v2(); // _ZN7S6887C12v2Ev
  virtual void  v3(); // _ZN7S6887C12v3Ev
  virtual void  v4(); // _ZN7S6887C12v4Ev
  ~S6887C1(); // tgen
  S6887C1(); // tgen
};
//SIG(1 S6887C1) C1{ BC2{ v5 v6 v7 Fp FL Fi Fc[5] Fi} BC3{ v8 v9 v10 Fp[2]} v1 v2 v3 v4 FC2 FC2 FC2}


void  S6887C1 ::v1(){vfunc_called(this, "_ZN7S6887C12v1Ev");}
void  S6887C1 ::v2(){vfunc_called(this, "_ZN7S6887C12v2Ev");}
void  S6887C1 ::v3(){vfunc_called(this, "_ZN7S6887C12v3Ev");}
void  S6887C1 ::v4(){vfunc_called(this, "_ZN7S6887C12v4Ev");}
S6887C1 ::~S6887C1(){ note_dtor("S6887C1", this);} // tgen
S6887C1 ::S6887C1(){ note_ctor("S6887C1", this);} // tgen

static void Test_S6887C1()
{
  extern Class_Descriptor cd_S6887C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(24,36)];
    init_test(&cd_S6887C1, buf);
    S6887C1 *dp, &lv = *(dp=new (buf) S6887C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(184,140), "sizeof(S6887C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S6887C1)");
    check_base_class_offset(lv, (S6887C2*), 0, "S6887C1");
    check_base_class_offset(lv, (S6887C3*), ABISELECT(40,32), "S6887C1");
    check_field_offset(lv, s6887c1f0, ABISELECT(64,44), "S6887C1.s6887c1f0");
    check_field_offset(lv, s6887c1f1, ABISELECT(104,76), "S6887C1.s6887c1f1");
    check_field_offset(lv, s6887c1f2, ABISELECT(144,108), "S6887C1.s6887c1f2");
    test_class_info(&lv, &cd_S6887C1);
    dp->~S6887C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS6887C1(Test_S6887C1, "S6887C1", ABISELECT(184,140));

#else // __cplusplus

extern void _ZN7S6887C1C1Ev();
extern void _ZN7S6887C1D1Ev();
Name_Map name_map_S6887C1[] = {
  NSPAIR(_ZN7S6887C1C1Ev),
  NSPAIR(_ZN7S6887C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S6887C2;
extern VTBL_ENTRY _ZTI7S6887C2[];
extern  VTBL_ENTRY _ZTV7S6887C2[];
extern Class_Descriptor cd_S6887C3;
extern VTBL_ENTRY _ZTI7S6887C3[];
extern  VTBL_ENTRY _ZTV7S6887C3[];
static Base_Class bases_S6887C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6887C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_S6887C3,    ABISELECT(40,32), //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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S6887C1[];
extern void _ZN7S6887C22v5Ev();
extern void _ZN7S6887C22v6Ev();
extern void _ZN7S6887C22v7Ev();
extern void _ZN7S6887C12v1Ev();
extern void _ZN7S6887C12v2Ev();
extern void _ZN7S6887C12v3Ev();
extern void _ZN7S6887C12v4Ev();
extern void _ZN7S6887C32v8Ev();
extern void _ZN7S6887C32v9Ev();
extern void _ZN7S6887C33v10Ev();
static  VTBL_ENTRY vtc_S6887C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S6887C1[0]),
  (VTBL_ENTRY)&_ZN7S6887C22v5Ev,
  (VTBL_ENTRY)&_ZN7S6887C22v6Ev,
  (VTBL_ENTRY)&_ZN7S6887C22v7Ev,
  (VTBL_ENTRY)&_ZN7S6887C12v1Ev,
  (VTBL_ENTRY)&_ZN7S6887C12v2Ev,
  (VTBL_ENTRY)&_ZN7S6887C12v3Ev,
  (VTBL_ENTRY)&_ZN7S6887C12v4Ev,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7S6887C1[0]),
  (VTBL_ENTRY)&_ZN7S6887C32v8Ev,
  (VTBL_ENTRY)&_ZN7S6887C32v9Ev,
  (VTBL_ENTRY)&_ZN7S6887C33v10Ev,
};
extern VTBL_ENTRY _ZTI7S6887C1[];
extern  VTBL_ENTRY _ZTV7S6887C1[];
Class_Descriptor cd_S6887C1 = {  "S6887C1", // class name
  bases_S6887C1, 2,
  &(vtc_S6887C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(184,140), // object size
  NSPAIRA(_ZTI7S6887C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7S6887C1),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C2  : S2718C3_nt {
};
//SIG(-1 S2709C2) C1{ BC2{ m Fi}}



static void Test_S2709C2()
{
  extern Class_Descriptor cd_S2709C2;
  void *lvp;
  {
    int buf[2];
    init_test(&cd_S2709C2, buf);
    S2709C2 &lv = *(new (buf) S2709C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), 4, "sizeof(S2709C2)");
    check2(__alignof__(lv), 4, "__alignof__(S2709C2)");
    check_base_class_offset(lv, (S2718C3_nt*), 0, "S2709C2");
    test_class_info(&lv, &cd_S2709C2);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2709C2(Test_S2709C2, "S2709C2", 4);

#else // __cplusplus

extern Class_Descriptor cd_S2718C3_nt;
static Base_Class bases_S2709C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2718C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2709C2 = {  "S2709C2", // class name
  bases_S2709C2, 1,
  0, // no vftv
  0, //no vtt
  4, // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C5_nt  {
  void *s2709c5f0;
  int s2709c5f1[4];
  void  mf2709c5(); // _ZN10S2709C5_nt8mf2709c5Ev
};
//SIG(-1 S2709C5_nt) C1{ m Fp Fi[4]}


void  S2709C5_nt ::mf2709c5(){}

//skip512 S2709C5_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C4_nt  {
  ::S2709C5_nt s2709c4f0;
  void  mf2709c4(); // _ZN10S2709C4_nt8mf2709c4Ev
};
//SIG(-1 S2709C4_nt) C1{ m FC2{ m Fp Fi[4]}}


void  S2709C4_nt ::mf2709c4(){}

//skip512 S2709C4_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C8_nt  {
  void *s2709c8f0;
  int s2709c8f1;
  void  mf2709c8(); // _ZN10S2709C8_nt8mf2709c8Ev
};
//SIG(-1 S2709C8_nt) C1{ m Fp Fi}


void  S2709C8_nt ::mf2709c8(){}

//skip512 S2709C8_nt

#else // __cplusplus

Class_Descriptor cd_S2709C8_nt = {  "S2709C8_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(16,8), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C9_nt  {
  __tsi64 s2709c9f0;
};
//SIG(-1 S2709C9_nt) C1{ FL}



//skip512 S2709C9_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C7  : S2709C8_nt {
  ::S2709C9_nt s2709c7f0;
};
//SIG(-1 S2709C7) C1{ BC2{ m Fp Fi} FC3{ FL}}



static void Test_S2709C7()
{
  extern Class_Descriptor cd_S2709C7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_S2709C7, buf);
    S2709C7 &lv = *(new (buf) S2709C7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S2709C7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2709C7)");
    check_base_class_offset(lv, (S2709C8_nt*), 0, "S2709C7");
    check_field_offset(lv, s2709c7f0, ABISELECT(16,8), "S2709C7.s2709c7f0");
    test_class_info(&lv, &cd_S2709C7);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2709C7(Test_S2709C7, "S2709C7", ABISELECT(24,16));

#else // __cplusplus

extern Class_Descriptor cd_S2709C8_nt;
static Base_Class bases_S2709C7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2709C8_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2709C7 = {  "S2709C7", // class name
  bases_S2709C7, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(24,16), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C6  {
  int s2709c6f0;
  ::S2709C7 s2709c6f1;
  void  mf2709c6(); // _ZN7S2709C68mf2709c6Ev
};
//SIG(-1 S2709C6) C1{ m Fi FC2{ BC3{ m Fp Fi} FC4{ FL}}}


void  S2709C6 ::mf2709c6(){}

static void Test_S2709C6()
{
  {
    init_simple_test("S2709C6");
    S2709C6 lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(S2709C6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2709C6)");
    check_field_offset(lv, s2709c6f0, 0, "S2709C6.s2709c6f0");
    check_field_offset(lv, s2709c6f1, ABISELECT(8,4), "S2709C6.s2709c6f1");
  }
}
static Arrange_To_Call_Me vS2709C6(Test_S2709C6, "S2709C6", ABISELECT(32,20));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2709C1  : S2709C2 {
  void *s2709c1f0;
  ::S2709C4_nt s2709c1f1;
  ::S2709C6 s2709c1f2;
};
//SIG(1 S2709C1) C1{ BC2{ BC3{ m Fi}} Fp FC4{ m FC5{ m Fp Fi[4]}} FC6{ m Fi FC7{ BC8{ m Fp Fi} FC9{ FL}}}}



static void Test_S2709C1()
{
  extern Class_Descriptor cd_S2709C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,13)];
    init_test(&cd_S2709C1, buf);
    S2709C1 &lv = *(new (buf) S2709C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,48), "sizeof(S2709C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2709C1)");
    check_base_class_offset(lv, (S2718C3_nt*)(S2709C2*), 0, "S2709C1");
    check_base_class_offset(lv, (S2709C2*), 0, "S2709C1");
    check_field_offset(lv, s2709c1f0, ABISELECT(8,4), "S2709C1.s2709c1f0");
    check_field_offset(lv, s2709c1f1, ABISELECT(16,8), "S2709C1.s2709c1f1");
    check_field_offset(lv, s2709c1f2, ABISELECT(40,28), "S2709C1.s2709c1f2");
    test_class_info(&lv, &cd_S2709C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2709C1(Test_S2709C1, "S2709C1", ABISELECT(72,48));

#else // __cplusplus

extern Class_Descriptor cd_S2718C3_nt;
extern Class_Descriptor cd_S2709C2;
static Base_Class bases_S2709C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2718C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2709C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2709C1 = {  "S2709C1", // class name
  bases_S2709C1, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(72,48), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11864C1  {
  ::S11863C2 s11864c1f0;
};
//SIG(1 S11864C1) C1{ FC2{ Fp[2] FL Fc Fi[2] Fp FC3{ Fp Fi[2] FU4{ Fi Fp Fp} Fs Fc Fc Fp FL FL}[8]}}



static void Test_S11864C1()
{
  {
    init_simple_test("S11864C1");
    S11864C1 lv;
    check2(sizeof(lv), ABISELECT(496,352), "sizeof(S11864C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11864C1)");
    check_field_offset(lv, s11864c1f0, 0, "S11864C1.s11864c1f0");
  }
}
static Arrange_To_Call_Me vS11864C1(Test_S11864C1, "S11864C1", ABISELECT(496,352));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5975C1  : S10103C42 {
  char s5975c1f0;
  int s5975c1f1;
  char s5975c1f2;
};
//SIG(1 S5975C1) C1{ BC2{ m Fp FC3{ m FC4{ m Fp Fi FC5{ m}} Fi} FC4 FC4 Fi} Fc Fi Fc}



static void Test_S5975C1()
{
  extern Class_Descriptor cd_S5975C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,16)];
    init_test(&cd_S5975C1, buf);
    S5975C1 &lv = *(new (buf) S5975C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,60), "sizeof(S5975C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5975C1)");
    check_base_class_offset(lv, (S10103C42*), 0, "S5975C1");
    check_field_offset(lv, s5975c1f0, ABISELECT(72,48), "S5975C1.s5975c1f0");
    check_field_offset(lv, s5975c1f1, ABISELECT(76,52), "S5975C1.s5975c1f1");
    check_field_offset(lv, s5975c1f2, ABISELECT(80,56), "S5975C1.s5975c1f2");
    test_class_info(&lv, &cd_S5975C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5975C1(Test_S5975C1, "S5975C1", ABISELECT(88,60));

#else // __cplusplus

extern Class_Descriptor cd_S10103C42;
static Base_Class bases_S5975C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C42,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5975C1 = {  "S5975C1", // class name
  bases_S5975C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(88,60), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9952C2_nt  {
  virtual  ~S9952C2_nt(); // _ZN10S9952C2_ntD1Ev
  virtual void  v5(); // _ZN10S9952C2_nt2v5Ev
  virtual void  v6(); // _ZN10S9952C2_nt2v6Ev
  virtual void  v7(); // _ZN10S9952C2_nt2v7Ev
  virtual void  v8(); // _ZN10S9952C2_nt2v8Ev
  S9952C2_nt(); // tgen
};
//SIG(-1 S9952C2_nt) C1{ vd v1 v2 v3 v4}


 S9952C2_nt ::~S9952C2_nt(){ note_dtor("S9952C2_nt", this);}
void  S9952C2_nt ::v5(){vfunc_called(this, "_ZN10S9952C2_nt2v5Ev");}
void  S9952C2_nt ::v6(){vfunc_called(this, "_ZN10S9952C2_nt2v6Ev");}
void  S9952C2_nt ::v7(){vfunc_called(this, "_ZN10S9952C2_nt2v7Ev");}
void  S9952C2_nt ::v8(){vfunc_called(this, "_ZN10S9952C2_nt2v8Ev");}
S9952C2_nt ::S9952C2_nt(){ note_ctor("S9952C2_nt", this);} // tgen

//skip512 S9952C2_nt

#else // __cplusplus

extern void _ZN10S9952C2_ntC1Ev();
extern void _ZN10S9952C2_ntD1Ev();
Name_Map name_map_S9952C2_nt[] = {
  NSPAIR(_ZN10S9952C2_ntC1Ev),
  NSPAIR(_ZN10S9952C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S9952C2_nt[];
extern void _ZN10S9952C2_ntD1Ev();
extern void _ZN10S9952C2_ntD0Ev();
extern void _ZN10S9952C2_nt2v5Ev();
extern void _ZN10S9952C2_nt2v6Ev();
extern void _ZN10S9952C2_nt2v7Ev();
extern void _ZN10S9952C2_nt2v8Ev();
static  VTBL_ENTRY vtc_S9952C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S9952C2_nt[0]),
  (VTBL_ENTRY)&_ZN10S9952C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v7Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v8Ev,
};
extern VTBL_ENTRY _ZTI10S9952C2_nt[];
VTBL_ENTRY *P__ZTI10S9952C2_nt = _ZTI10S9952C2_nt; 
extern  VTBL_ENTRY _ZTV10S9952C2_nt[];
Class_Descriptor cd_S9952C2_nt = {  "S9952C2_nt", // class name
  0,0,//no base classes
  &(vtc_S9952C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI10S9952C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV10S9952C2_nt),8, //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

struct  S9952C3_nt  {
  short s9952c3f0[3];
  void  mf9952c3(); // _ZN10S9952C3_nt8mf9952c3Ev
};
//SIG(-1 S9952C3_nt) C1{ m Fs[3]}


void  S9952C3_nt ::mf9952c3(){}

//skip512 S9952C3_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9952C1  : S9952C2_nt {
  ::S9952C3_nt s9952c1f0;
  ::S9952C3_nt s9952c1f1;
  ::S9952C3_nt s9952c1f2;
  ::S9952C3_nt s9952c1f3;
  ::S9952C3_nt s9952c1f4;
  ::S9952C3_nt s9952c1f5;
  ::S9952C3_nt s9952c1f6;
  ::S9952C3_nt s9952c1f7;
  virtual void  v1(); // _ZN7S9952C12v1Ev
  virtual void  v2(); // _ZN7S9952C12v2Ev
  virtual void  v3(); // _ZN7S9952C12v3Ev
  virtual void  v4(); // _ZN7S9952C12v4Ev
  ~S9952C1(); // tgen
  S9952C1(); // tgen
};
//SIG(1 S9952C1) C1{ BC2{ vd v5 v6 v7 v8} v1 v2 v3 v4 FC3{ m Fs[3]} FC3 FC3 FC3 FC3 FC3 FC3 FC3}


void  S9952C1 ::v1(){vfunc_called(this, "_ZN7S9952C12v1Ev");}
void  S9952C1 ::v2(){vfunc_called(this, "_ZN7S9952C12v2Ev");}
void  S9952C1 ::v3(){vfunc_called(this, "_ZN7S9952C12v3Ev");}
void  S9952C1 ::v4(){vfunc_called(this, "_ZN7S9952C12v4Ev");}
S9952C1 ::~S9952C1(){ note_dtor("S9952C1", this);} // tgen
S9952C1 ::S9952C1(){ note_ctor("S9952C1", this);} // tgen

static void Test_S9952C1()
{
  extern Class_Descriptor cd_S9952C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,14)];
    init_test(&cd_S9952C1, buf);
    S9952C1 *dp, &lv = *(dp=new (buf) S9952C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,52), "sizeof(S9952C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9952C1)");
    check_base_class_offset(lv, (S9952C2_nt*), 0, "S9952C1");
    check_field_offset(lv, s9952c1f0, ABISELECT(8,4), "S9952C1.s9952c1f0");
    check_field_offset(lv, s9952c1f1, ABISELECT(14,10), "S9952C1.s9952c1f1");
    check_field_offset(lv, s9952c1f2, ABISELECT(20,16), "S9952C1.s9952c1f2");
    check_field_offset(lv, s9952c1f3, ABISELECT(26,22), "S9952C1.s9952c1f3");
    check_field_offset(lv, s9952c1f4, ABISELECT(32,28), "S9952C1.s9952c1f4");
    check_field_offset(lv, s9952c1f5, ABISELECT(38,34), "S9952C1.s9952c1f5");
    check_field_offset(lv, s9952c1f6, ABISELECT(44,40), "S9952C1.s9952c1f6");
    check_field_offset(lv, s9952c1f7, ABISELECT(50,46), "S9952C1.s9952c1f7");
    test_class_info(&lv, &cd_S9952C1);
    dp->~S9952C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9952C1(Test_S9952C1, "S9952C1", ABISELECT(56,52));

#else // __cplusplus

extern void _ZN7S9952C1C1Ev();
extern void _ZN7S9952C1D1Ev();
Name_Map name_map_S9952C1[] = {
  NSPAIR(_ZN7S9952C1C1Ev),
  NSPAIR(_ZN7S9952C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9952C2_nt;
extern VTBL_ENTRY _ZTI10S9952C2_nt[];
extern  VTBL_ENTRY _ZTV10S9952C2_nt[];
static Base_Class bases_S9952C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9952C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9952C1[];
extern void _ZN7S9952C1D1Ev();
extern void _ZN7S9952C1D0Ev();
extern void _ZN10S9952C2_nt2v5Ev();
extern void _ZN10S9952C2_nt2v6Ev();
extern void _ZN10S9952C2_nt2v7Ev();
extern void _ZN10S9952C2_nt2v8Ev();
extern void _ZN7S9952C12v1Ev();
extern void _ZN7S9952C12v2Ev();
extern void _ZN7S9952C12v3Ev();
extern void _ZN7S9952C12v4Ev();
static  VTBL_ENTRY vtc_S9952C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9952C1[0]),
  (VTBL_ENTRY)&_ZN7S9952C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9952C1D0Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v5Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v7Ev,
  (VTBL_ENTRY)&_ZN10S9952C2_nt2v8Ev,
  (VTBL_ENTRY)&_ZN7S9952C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9952C12v2Ev,
  (VTBL_ENTRY)&_ZN7S9952C12v3Ev,
  (VTBL_ENTRY)&_ZN7S9952C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S9952C1[];
extern  VTBL_ENTRY _ZTV7S9952C1[];
Class_Descriptor cd_S9952C1 = {  "S9952C1", // class name
  bases_S9952C1, 1,
  &(vtc_S9952C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,52), // object size
  NSPAIRA(_ZTI7S9952C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9952C1),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9395C2  {
  ::S10103C14_nt s9395c2f0;
  int s9395c2f1[2];
  char s9395c2f2;
  virtual  ~S9395C2(); // _ZN7S9395C2D1Ev
  virtual void  v3(); // _ZN7S9395C22v3Ev
  virtual void  v4(); // _ZN7S9395C22v4Ev
  virtual void  v5(); // _ZN7S9395C22v5Ev
  S9395C2(); // tgen
};
//SIG(-1 S9395C2) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S9395C2 ::~S9395C2(){ note_dtor("S9395C2", this);}
void  S9395C2 ::v3(){vfunc_called(this, "_ZN7S9395C22v3Ev");}
void  S9395C2 ::v4(){vfunc_called(this, "_ZN7S9395C22v4Ev");}
void  S9395C2 ::v5(){vfunc_called(this, "_ZN7S9395C22v5Ev");}
S9395C2 ::S9395C2(){ note_ctor("S9395C2", this);} // tgen

static void Test_S9395C2()
{
  extern Class_Descriptor cd_S9395C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S9395C2, buf);
    S9395C2 *dp, &lv = *(dp=new (buf) S9395C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S9395C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9395C2)");
    check_field_offset(lv, s9395c2f0, ABISELECT(8,4), "S9395C2.s9395c2f0");
    check_field_offset(lv, s9395c2f1, ABISELECT(24,16), "S9395C2.s9395c2f1");
    check_field_offset(lv, s9395c2f2, ABISELECT(32,24), "S9395C2.s9395c2f2");
    test_class_info(&lv, &cd_S9395C2);
    dp->~S9395C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9395C2(Test_S9395C2, "S9395C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S9395C2C1Ev();
extern void _ZN7S9395C2D1Ev();
Name_Map name_map_S9395C2[] = {
  NSPAIR(_ZN7S9395C2C1Ev),
  NSPAIR(_ZN7S9395C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9395C2[];
extern void _ZN7S9395C2D1Ev();
extern void _ZN7S9395C2D0Ev();
extern void _ZN7S9395C22v3Ev();
extern void _ZN7S9395C22v4Ev();
extern void _ZN7S9395C22v5Ev();
static  VTBL_ENTRY vtc_S9395C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9395C2[0]),
  (VTBL_ENTRY)&_ZN7S9395C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9395C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9395C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9395C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9395C22v5Ev,
};
extern VTBL_ENTRY _ZTI7S9395C2[];
extern  VTBL_ENTRY _ZTV7S9395C2[];
Class_Descriptor cd_S9395C2 = {  "S9395C2", // class name
  0,0,//no base classes
  &(vtc_S9395C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S9395C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9395C2),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9395C1  : S9395C2 {
  void *s9395c1f0[2];
  int s9395c1f1;
  ::S10103C14_nt s9395c1f2;
  int s9395c1f3;
  virtual  ~S9395C1(); // _ZN7S9395C1D1Ev
  virtual void  v1(); // _ZN7S9395C12v1Ev
  virtual void  v2(); // _ZN7S9395C12v2Ev
  S9395C1(); // tgen
};
//SIG(1 S9395C1) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fp[2] Fi FC3 Fi}


 S9395C1 ::~S9395C1(){ note_dtor("S9395C1", this);}
void  S9395C1 ::v1(){vfunc_called(this, "_ZN7S9395C12v1Ev");}
void  S9395C1 ::v2(){vfunc_called(this, "_ZN7S9395C12v2Ev");}
S9395C1 ::S9395C1(){ note_ctor("S9395C1", this);} // tgen

static void Test_S9395C1()
{
  extern Class_Descriptor cd_S9395C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,15)];
    init_test(&cd_S9395C1, buf);
    S9395C1 *dp, &lv = *(dp=new (buf) S9395C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,56), "sizeof(S9395C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9395C1)");
    check_base_class_offset(lv, (S9395C2*), 0, "S9395C1");
    check_field_offset(lv, s9395c1f0, ABISELECT(40,28), "S9395C1.s9395c1f0");
    check_field_offset(lv, s9395c1f1, ABISELECT(56,36), "S9395C1.s9395c1f1");
    check_field_offset(lv, s9395c1f2, ABISELECT(64,40), "S9395C1.s9395c1f2");
    check_field_offset(lv, s9395c1f3, ABISELECT(80,52), "S9395C1.s9395c1f3");
    test_class_info(&lv, &cd_S9395C1);
    dp->~S9395C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9395C1(Test_S9395C1, "S9395C1", ABISELECT(88,56));

#else // __cplusplus

extern void _ZN7S9395C1C1Ev();
extern void _ZN7S9395C1D1Ev();
Name_Map name_map_S9395C1[] = {
  NSPAIR(_ZN7S9395C1C1Ev),
  NSPAIR(_ZN7S9395C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9395C2;
extern VTBL_ENTRY _ZTI7S9395C2[];
extern  VTBL_ENTRY _ZTV7S9395C2[];
static Base_Class bases_S9395C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9395C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9395C1[];
extern void _ZN7S9395C1D1Ev();
extern void _ZN7S9395C1D0Ev();
extern void _ZN7S9395C22v3Ev();
extern void _ZN7S9395C22v4Ev();
extern void _ZN7S9395C22v5Ev();
extern void _ZN7S9395C12v1Ev();
extern void _ZN7S9395C12v2Ev();
static  VTBL_ENTRY vtc_S9395C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9395C1[0]),
  (VTBL_ENTRY)&_ZN7S9395C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9395C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9395C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9395C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9395C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9395C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9395C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9395C1[];
extern  VTBL_ENTRY _ZTV7S9395C1[];
Class_Descriptor cd_S9395C1 = {  "S9395C1", // class name
  bases_S9395C1, 1,
  &(vtc_S9395C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(88,56), // object size
  NSPAIRA(_ZTI7S9395C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9395C1),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10459C2_nt  {
  int s10459c2f0[4];
  char s10459c2f1[49];
};
//SIG(-1 S10459C2_nt) C1{ Fi[4] Fc[49]}



//skip512 S10459C2_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10459C3_nt  {
  int s10459c3f0;
  char s10459c3f1[50];
};
//SIG(-1 S10459C3_nt) C1{ Fi Fc[50]}



//skip512 S10459C3_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10459C4  {
  int s10459c4f0[2];
  long s10459c4f1;
  char s10459c4f2[255];
};
//SIG(-1 S10459C4) C1{ Fi[2] Fl Fc[255]}



static void Test_S10459C4()
{
  {
    init_simple_test("S10459C4");
    S10459C4 lv;
    check2(sizeof(lv), ABISELECT(272,268), "sizeof(S10459C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10459C4)");
    check_field_offset(lv, s10459c4f0, 0, "S10459C4.s10459c4f0");
    check_field_offset(lv, s10459c4f1, 8, "S10459C4.s10459c4f1");
    check_field_offset(lv, s10459c4f2, ABISELECT(16,12), "S10459C4.s10459c4f2");
  }
}
static Arrange_To_Call_Me vS10459C4(Test_S10459C4, "S10459C4", ABISELECT(272,268));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10459C1  {
  char s10459c1f0;
  int s10459c1f1;
  ::S10459C2_nt s10459c1f2;
  ::S10459C3_nt s10459c1f3;
  char s10459c1f4[2];
  int s10459c1f5;
  ::S10459C4 s10459c1f6;
};
//SIG(1 S10459C1) C1{ Fc Fi FC2{ Fi[4] Fc[49]} FC3{ Fi Fc[50]} Fc[2] Fi FC4{ Fi[2] Fl Fc[255]}}



static void Test_S10459C1()
{
  {
    init_simple_test("S10459C1");
    S10459C1 lv;
    check2(sizeof(lv), ABISELECT(416,408), "sizeof(S10459C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10459C1)");
    check_field_offset(lv, s10459c1f0, 0, "S10459C1.s10459c1f0");
    check_field_offset(lv, s10459c1f1, 4, "S10459C1.s10459c1f1");
    check_field_offset(lv, s10459c1f2, 8, "S10459C1.s10459c1f2");
    check_field_offset(lv, s10459c1f3, 76, "S10459C1.s10459c1f3");
    check_field_offset(lv, s10459c1f4, 132, "S10459C1.s10459c1f4");
    check_field_offset(lv, s10459c1f5, 136, "S10459C1.s10459c1f5");
    check_field_offset(lv, s10459c1f6, ABISELECT(144,140), "S10459C1.s10459c1f6");
  }
}
static Arrange_To_Call_Me vS10459C1(Test_S10459C1, "S10459C1", ABISELECT(416,408));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11986C1  {
  ::S2718C8 s11986c1f0;
  void *s11986c1f1;
  ::S10103C105 s11986c1f2;
  int s11986c1f3[3];
  int s11986c1f4:8;
};
//SIG(1 S11986C1) C1{ FC2{ m FC3{ m FC4{ m FC5{ m Fp}}} FC6{ BC7{ m Fp}}} Fp FC8{ m Fp} Fi[3] Fi:8}



static void Test_S11986C1()
{
  {
    init_simple_test("S11986C1");
    static S11986C1 lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(S11986C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11986C1)");
    check_field_offset(lv, s11986c1f0, 0, "S11986C1.s11986c1f0");
    check_field_offset(lv, s11986c1f1, ABISELECT(16,8), "S11986C1.s11986c1f1");
    check_field_offset(lv, s11986c1f2, ABISELECT(24,12), "S11986C1.s11986c1f2");
    check_field_offset(lv, s11986c1f3, ABISELECT(32,16), "S11986C1.s11986c1f3");
    set_bf_and_test(lv, s11986c1f4, ABISELECT(44,28), 0, 8, 1, "S11986C1");
    set_bf_and_test(lv, s11986c1f4, ABISELECT(44,28), 0, 8, hide_sll(1LL<<7), "S11986C1");
  }
}
static Arrange_To_Call_Me vS11986C1(Test_S11986C1, "S11986C1", ABISELECT(48,32));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10352C1  : S10103C109_nt {
  ::S10103C96 s10352c1f0;
  char s10352c1f1;
};
//SIG(1 S10352C1) C1{ BC2{} FC3{ vd m FL[2] Fi FC4{ m Fp Fi FC5{ m}} FC4 FC4 FC4 FC6{ m Fp}} Fc}



static void Test_S10352C1()
{
  extern Class_Descriptor cd_S10352C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,21)];
    init_test(&cd_S10352C1, buf);
    S10352C1 &lv = *(new (buf) S10352C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,80), "sizeof(S10352C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10352C1)");
    check_base_class_offset(lv, (S10103C109_nt*), 0, "S10352C1");
    check_field_offset(lv, s10352c1f0, 0, "S10352C1.s10352c1f0");
    check_field_offset(lv, s10352c1f1, ABISELECT(104,76), "S10352C1.s10352c1f1");
    test_class_info(&lv, &cd_S10352C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10352C1(Test_S10352C1, "S10352C1", ABISELECT(112,80));

#else // __cplusplus

extern Class_Descriptor cd_S10103C109_nt;
extern VTBL_ENTRY _ZTI13S10103C109_nt[];
static Base_Class bases_S10352C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C109_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S10352C1 = {  "S10352C1", // class name
  bases_S10352C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(112,80), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10353C1  : S10103C109_nt {
  ::S10103C96 s10353c1f0;
};
//SIG(1 S10353C1) C1{ BC2{} FC3{ vd m FL[2] Fi FC4{ m Fp Fi FC5{ m}} FC4 FC4 FC4 FC6{ m Fp}}}



static void Test_S10353C1()
{
  extern Class_Descriptor cd_S10353C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(14,20)];
    init_test(&cd_S10353C1, buf);
    S10353C1 &lv = *(new (buf) S10353C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(104,76), "sizeof(S10353C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10353C1)");
    check_base_class_offset(lv, (S10103C109_nt*), 0, "S10353C1");
    check_field_offset(lv, s10353c1f0, 0, "S10353C1.s10353c1f0");
    test_class_info(&lv, &cd_S10353C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10353C1(Test_S10353C1, "S10353C1", ABISELECT(104,76));

#else // __cplusplus

extern Class_Descriptor cd_S10103C109_nt;
extern VTBL_ENTRY _ZTI13S10103C109_nt[];
static Base_Class bases_S10353C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C109_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S10353C1 = {  "S10353C1", // class name
  bases_S10353C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(104,76), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2519C3  {
  int s2519c3f0;
  char s2519c3f1;
  long s2519c3f2;
  __tsi64 s2519c3f3;
  void *s2519c3f4;
  void  mf2519c3(); // _ZN7S2519C38mf2519c3Ev
};
//SIG(-1 S2519C3) C1{ m Fi Fc Fl FL Fp}


void  S2519C3 ::mf2519c3(){}

static void Test_S2519C3()
{
  {
    init_simple_test("S2519C3");
    S2519C3 lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(S2519C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2519C3)");
    check_field_offset(lv, s2519c3f0, 0, "S2519C3.s2519c3f0");
    check_field_offset(lv, s2519c3f1, 4, "S2519C3.s2519c3f1");
    check_field_offset(lv, s2519c3f2, 8, "S2519C3.s2519c3f2");
    check_field_offset(lv, s2519c3f3, ABISELECT(16,12), "S2519C3.s2519c3f3");
    check_field_offset(lv, s2519c3f4, ABISELECT(24,20), "S2519C3.s2519c3f4");
  }
}
static Arrange_To_Call_Me vS2519C3(Test_S2519C3, "S2519C3", ABISELECT(32,24));

#else // __cplusplus

extern VTBL_ENTRY _ZTI7S2519C3[];
VTBL_ENTRY *P__ZTI7S2519C3 = _ZTI7S2519C3; 
Class_Descriptor cd_S2519C3 = {  "S2519C3", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7S2519C3),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2519C2  : S2519C3 {
  virtual void  v9(); // _ZN7S2519C22v9Ev
  virtual void  v10(); // _ZN7S2519C23v10Ev
  virtual void  v11(); // _ZN7S2519C23v11Ev
  virtual void  v12(); // _ZN7S2519C23v12Ev
  ~S2519C2(); // tgen
  S2519C2(); // tgen
};
//SIG(-1 S2519C2) C1{ BC2{ m Fi Fc Fl FL Fp} v1 v2 v3 v4}


void  S2519C2 ::v9(){vfunc_called(this, "_ZN7S2519C22v9Ev");}
void  S2519C2 ::v10(){vfunc_called(this, "_ZN7S2519C23v10Ev");}
void  S2519C2 ::v11(){vfunc_called(this, "_ZN7S2519C23v11Ev");}
void  S2519C2 ::v12(){vfunc_called(this, "_ZN7S2519C23v12Ev");}
S2519C2 ::~S2519C2(){ note_dtor("S2519C2", this);} // tgen
S2519C2 ::S2519C2(){ note_ctor("S2519C2", this);} // tgen

static void Test_S2519C2()
{
  extern Class_Descriptor cd_S2519C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2519C2, buf);
    S2519C2 *dp, &lv = *(dp=new (buf) S2519C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2519C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2519C2)");
    check_base_class_offset(lv, (S2519C3*), ABISELECT(8,4), "S2519C2");
    test_class_info(&lv, &cd_S2519C2);
    dp->~S2519C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2519C2(Test_S2519C2, "S2519C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2519C2C1Ev();
extern void _ZN7S2519C2D1Ev();
Name_Map name_map_S2519C2[] = {
  NSPAIR(_ZN7S2519C2C1Ev),
  NSPAIR(_ZN7S2519C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S2519C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2519C2[];
extern void _ZN7S2519C22v9Ev();
extern void _ZN7S2519C23v10Ev();
extern void _ZN7S2519C23v11Ev();
extern void _ZN7S2519C23v12Ev();
static  VTBL_ENTRY vtc_S2519C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2519C2[0]),
  (VTBL_ENTRY)&_ZN7S2519C22v9Ev,
  (VTBL_ENTRY)&_ZN7S2519C23v10Ev,
  (VTBL_ENTRY)&_ZN7S2519C23v11Ev,
  (VTBL_ENTRY)&_ZN7S2519C23v12Ev,
};
extern VTBL_ENTRY _ZTI7S2519C2[];
extern  VTBL_ENTRY _ZTV7S2519C2[];
Class_Descriptor cd_S2519C2 = {  "S2519C2", // class name
  bases_S2519C2, 1,
  &(vtc_S2519C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2519C2),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7S2519C2),6, //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

struct  S2519C1  : S2519C2 {
  virtual void  v1(); // _ZN7S2519C12v1Ev
  virtual void  v2(); // _ZN7S2519C12v2Ev
  virtual void  v3(); // _ZN7S2519C12v3Ev
  virtual void  v4(); // _ZN7S2519C12v4Ev
  virtual void  v5(); // _ZN7S2519C12v5Ev
  virtual void  v6(); // _ZN7S2519C12v6Ev
  virtual void  v7(); // _ZN7S2519C12v7Ev
  virtual void  v8(); // _ZN7S2519C12v8Ev
  ~S2519C1(); // tgen
  S2519C1(); // tgen
};
//SIG(1 S2519C1) C1{ BC2{ BC3{ m Fi Fc Fl FL Fp} v9 v10 v11 v12} v1 v2 v3 v4 v5 v6 v7 v8}


void  S2519C1 ::v1(){vfunc_called(this, "_ZN7S2519C12v1Ev");}
void  S2519C1 ::v2(){vfunc_called(this, "_ZN7S2519C12v2Ev");}
void  S2519C1 ::v3(){vfunc_called(this, "_ZN7S2519C12v3Ev");}
void  S2519C1 ::v4(){vfunc_called(this, "_ZN7S2519C12v4Ev");}
void  S2519C1 ::v5(){vfunc_called(this, "_ZN7S2519C12v5Ev");}
void  S2519C1 ::v6(){vfunc_called(this, "_ZN7S2519C12v6Ev");}
void  S2519C1 ::v7(){vfunc_called(this, "_ZN7S2519C12v7Ev");}
void  S2519C1 ::v8(){vfunc_called(this, "_ZN7S2519C12v8Ev");}
S2519C1 ::~S2519C1(){ note_dtor("S2519C1", this);} // tgen
S2519C1 ::S2519C1(){ note_ctor("S2519C1", this);} // tgen

static void Test_S2519C1()
{
  extern Class_Descriptor cd_S2519C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2519C1, buf);
    S2519C1 *dp, &lv = *(dp=new (buf) S2519C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2519C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2519C1)");
    check_base_class_offset(lv, (S2519C3*)(S2519C2*), ABISELECT(8,4), "S2519C1");
    check_base_class_offset(lv, (S2519C2*), 0, "S2519C1");
    test_class_info(&lv, &cd_S2519C1);
    dp->~S2519C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2519C1(Test_S2519C1, "S2519C1", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2519C1C1Ev();
extern void _ZN7S2519C1D1Ev();
Name_Map name_map_S2519C1[] = {
  NSPAIR(_ZN7S2519C1C1Ev),
  NSPAIR(_ZN7S2519C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
extern Class_Descriptor cd_S2519C2;
extern VTBL_ENTRY _ZTI7S2519C2[];
extern  VTBL_ENTRY _ZTV7S2519C2[];
static Base_Class bases_S2519C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2519C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2519C1[];
extern void _ZN7S2519C22v9Ev();
extern void _ZN7S2519C23v10Ev();
extern void _ZN7S2519C23v11Ev();
extern void _ZN7S2519C23v12Ev();
extern void _ZN7S2519C12v1Ev();
extern void _ZN7S2519C12v2Ev();
extern void _ZN7S2519C12v3Ev();
extern void _ZN7S2519C12v4Ev();
extern void _ZN7S2519C12v5Ev();
extern void _ZN7S2519C12v6Ev();
extern void _ZN7S2519C12v7Ev();
extern void _ZN7S2519C12v8Ev();
static  VTBL_ENTRY vtc_S2519C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2519C1[0]),
  (VTBL_ENTRY)&_ZN7S2519C22v9Ev,
  (VTBL_ENTRY)&_ZN7S2519C23v10Ev,
  (VTBL_ENTRY)&_ZN7S2519C23v11Ev,
  (VTBL_ENTRY)&_ZN7S2519C23v12Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v1Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v2Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v3Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v4Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v5Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v6Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v7Ev,
  (VTBL_ENTRY)&_ZN7S2519C12v8Ev,
};
extern VTBL_ENTRY _ZTI7S2519C1[];
extern  VTBL_ENTRY _ZTV7S2519C1[];
Class_Descriptor cd_S2519C1 = {  "S2519C1", // class name
  bases_S2519C1, 2,
  &(vtc_S2519C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2519C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2519C1),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S21262C2  {
  char s21262c2f0[4096];
  void *s21262c2f1;
  int s21262c2f2[4];
  short s21262c2f3;
  char s21262c2f4[2];
};
//SIG(-1 S21262C2) C1{ Fc[4096] Fp Fi[4] Fs Fc[2]}



static void Test_S21262C2()
{
  {
    init_simple_test("S21262C2");
    S21262C2 lv;
    check2(sizeof(lv), ABISELECT(4128,4120), "sizeof(S21262C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21262C2)");
    check_field_offset(lv, s21262c2f0, 0, "S21262C2.s21262c2f0");
    check_field_offset(lv, s21262c2f1, 4096, "S21262C2.s21262c2f1");
    check_field_offset(lv, s21262c2f2, ABISELECT(4104,4100), "S21262C2.s21262c2f2");
    check_field_offset(lv, s21262c2f3, ABISELECT(4120,4116), "S21262C2.s21262c2f3");
    check_field_offset(lv, s21262c2f4, ABISELECT(4122,4118), "S21262C2.s21262c2f4");
  }
}
static Arrange_To_Call_Me vS21262C2(Test_S21262C2, "S21262C2", ABISELECT(4128,4120));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S21262C1  {
  char s21262c1f0;
  void *s21262c1f1;
  int s21262c1f2[2];
  ::S21262C2 s21262c1f3;
  int s21262c1f4;
  void *s21262c1f5;
  char s21262c1f6[3];
  int s21262c1f7;
  void  mf21262c1(); // _ZN8S21262C19mf21262c1Ev
  virtual  ~S21262C1(); // _ZN8S21262C1D1Ev
  S21262C1(); // tgen
};
//SIG(1 S21262C1) C1{ vd m Fc Fp Fi[2] FC2{ Fc[4096] Fp Fi[4] Fs Fc[2]} Fi Fp Fc[3] Fi}


void  S21262C1 ::mf21262c1(){}
 S21262C1 ::~S21262C1(){ note_dtor("S21262C1", this);}
S21262C1 ::S21262C1(){ note_ctor("S21262C1", this);} // tgen

static void Test_S21262C1()
{
  extern Class_Descriptor cd_S21262C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(524,1040)];
    init_test(&cd_S21262C1, buf);
    S21262C1 *dp, &lv = *(dp=new (buf) S21262C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(4184,4156), "sizeof(S21262C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21262C1)");
    check_field_offset(lv, s21262c1f0, ABISELECT(8,4), "S21262C1.s21262c1f0");
    check_field_offset(lv, s21262c1f1, ABISELECT(16,8), "S21262C1.s21262c1f1");
    check_field_offset(lv, s21262c1f2, ABISELECT(24,12), "S21262C1.s21262c1f2");
    check_field_offset(lv, s21262c1f3, ABISELECT(32,20), "S21262C1.s21262c1f3");
    check_field_offset(lv, s21262c1f4, ABISELECT(4160,4140), "S21262C1.s21262c1f4");
    check_field_offset(lv, s21262c1f5, ABISELECT(4168,4144), "S21262C1.s21262c1f5");
    check_field_offset(lv, s21262c1f6, ABISELECT(4176,4148), "S21262C1.s21262c1f6");
    check_field_offset(lv, s21262c1f7, ABISELECT(4180,4152), "S21262C1.s21262c1f7");
    test_class_info(&lv, &cd_S21262C1);
    dp->~S21262C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS21262C1(Test_S21262C1, "S21262C1", ABISELECT(4184,4156));

#else // __cplusplus

extern void _ZN8S21262C1C1Ev();
extern void _ZN8S21262C1D1Ev();
Name_Map name_map_S21262C1[] = {
  NSPAIR(_ZN8S21262C1C1Ev),
  NSPAIR(_ZN8S21262C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S21262C1[];
extern void _ZN8S21262C1D1Ev();
extern void _ZN8S21262C1D0Ev();
static  VTBL_ENTRY vtc_S21262C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S21262C1[0]),
  (VTBL_ENTRY)&_ZN8S21262C1D1Ev,
  (VTBL_ENTRY)&_ZN8S21262C1D0Ev,
};
extern VTBL_ENTRY _ZTI8S21262C1[];
extern  VTBL_ENTRY _ZTV8S21262C1[];
Class_Descriptor cd_S21262C1 = {  "S21262C1", // class name
  0,0,//no base classes
  &(vtc_S21262C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(4184,4156), // object size
  NSPAIRA(_ZTI8S21262C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S21262C1),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9328C2  {
  ::S10103C14_nt s9328c2f0;
  int s9328c2f1[2];
  char s9328c2f2;
  virtual  ~S9328C2(); // _ZN7S9328C2D1Ev
  virtual void  v3(); // _ZN7S9328C22v3Ev
  virtual void  v4(); // _ZN7S9328C22v4Ev
  virtual void  v5(); // _ZN7S9328C22v5Ev
  S9328C2(); // tgen
};
//SIG(-1 S9328C2) C1{ vd v1 v2 v3 FC2{ m Fp Fi FC3{ m}} Fi[2] Fc}


 S9328C2 ::~S9328C2(){ note_dtor("S9328C2", this);}
void  S9328C2 ::v3(){vfunc_called(this, "_ZN7S9328C22v3Ev");}
void  S9328C2 ::v4(){vfunc_called(this, "_ZN7S9328C22v4Ev");}
void  S9328C2 ::v5(){vfunc_called(this, "_ZN7S9328C22v5Ev");}
S9328C2 ::S9328C2(){ note_ctor("S9328C2", this);} // tgen

static void Test_S9328C2()
{
  extern Class_Descriptor cd_S9328C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S9328C2, buf);
    S9328C2 *dp, &lv = *(dp=new (buf) S9328C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S9328C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9328C2)");
    check_field_offset(lv, s9328c2f0, ABISELECT(8,4), "S9328C2.s9328c2f0");
    check_field_offset(lv, s9328c2f1, ABISELECT(24,16), "S9328C2.s9328c2f1");
    check_field_offset(lv, s9328c2f2, ABISELECT(32,24), "S9328C2.s9328c2f2");
    test_class_info(&lv, &cd_S9328C2);
    dp->~S9328C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9328C2(Test_S9328C2, "S9328C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S9328C2C1Ev();
extern void _ZN7S9328C2D1Ev();
Name_Map name_map_S9328C2[] = {
  NSPAIR(_ZN7S9328C2C1Ev),
  NSPAIR(_ZN7S9328C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9328C2[];
extern void _ZN7S9328C2D1Ev();
extern void _ZN7S9328C2D0Ev();
extern void _ZN7S9328C22v3Ev();
extern void _ZN7S9328C22v4Ev();
extern void _ZN7S9328C22v5Ev();
static  VTBL_ENTRY vtc_S9328C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9328C2[0]),
  (VTBL_ENTRY)&_ZN7S9328C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9328C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9328C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9328C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9328C22v5Ev,
};
extern VTBL_ENTRY _ZTI7S9328C2[];
extern  VTBL_ENTRY _ZTV7S9328C2[];
Class_Descriptor cd_S9328C2 = {  "S9328C2", // class name
  0,0,//no base classes
  &(vtc_S9328C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S9328C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9328C2),7, //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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9328C1  : S9328C2 {
  int s9328c1f0;
  void *s9328c1f1[2];
  virtual  ~S9328C1(); // _ZN7S9328C1D1Ev
  virtual void  v1(); // _ZN7S9328C12v1Ev
  virtual void  v2(); // _ZN7S9328C12v2Ev
  S9328C1(); // tgen
};
//SIG(1 S9328C1) C1{ BC2{ vd v3 v4 v5 FC3{ m Fp Fi FC4{ m}} Fi[2] Fc} vd v1 v2 Fi Fp[2]}


 S9328C1 ::~S9328C1(){ note_dtor("S9328C1", this);}
void  S9328C1 ::v1(){vfunc_called(this, "_ZN7S9328C12v1Ev");}
void  S9328C1 ::v2(){vfunc_called(this, "_ZN7S9328C12v2Ev");}
S9328C1 ::S9328C1(){ note_ctor("S9328C1", this);} // tgen

static void Test_S9328C1()
{
  extern Class_Descriptor cd_S9328C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_S9328C1, buf);
    S9328C1 *dp, &lv = *(dp=new (buf) S9328C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(S9328C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9328C1)");
    check_base_class_offset(lv, (S9328C2*), 0, "S9328C1");
    check_field_offset(lv, s9328c1f0, ABISELECT(36,28), "S9328C1.s9328c1f0");
    check_field_offset(lv, s9328c1f1, ABISELECT(40,32), "S9328C1.s9328c1f1");
    test_class_info(&lv, &cd_S9328C1);
    dp->~S9328C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9328C1(Test_S9328C1, "S9328C1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7S9328C1C1Ev();
extern void _ZN7S9328C1D1Ev();
Name_Map name_map_S9328C1[] = {
  NSPAIR(_ZN7S9328C1C1Ev),
  NSPAIR(_ZN7S9328C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9328C2;
extern VTBL_ENTRY _ZTI7S9328C2[];
extern  VTBL_ENTRY _ZTV7S9328C2[];
static Base_Class bases_S9328C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9328C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9328C1[];
extern void _ZN7S9328C1D1Ev();
extern void _ZN7S9328C1D0Ev();
extern void _ZN7S9328C22v3Ev();
extern void _ZN7S9328C22v4Ev();
extern void _ZN7S9328C22v5Ev();
extern void _ZN7S9328C12v1Ev();
extern void _ZN7S9328C12v2Ev();
static  VTBL_ENTRY vtc_S9328C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9328C1[0]),
  (VTBL_ENTRY)&_ZN7S9328C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9328C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9328C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9328C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9328C22v5Ev,
  (VTBL_ENTRY)&_ZN7S9328C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9328C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9328C1[];
extern  VTBL_ENTRY _ZTV7S9328C1[];
Class_Descriptor cd_S9328C1 = {  "S9328C1", // class name
  bases_S9328C1, 1,
  &(vtc_S9328C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7S9328C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9328C1),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12199C3  {
  int s12199c3f0;
  int s12199c3f1;
  char s12199c3f2[9];
};
//SIG(1 S12199C3) C1{ Fi[2] Fc[9]}



static void Test_S12199C3()
{
  {
    init_simple_test("S12199C3");
    S12199C3 lv;
    check2(sizeof(lv), 20, "sizeof(S12199C3)");
    check2(__alignof__(lv), 4, "__alignof__(S12199C3)");
    check_field_offset(lv, s12199c3f0, 0, "S12199C3.s12199c3f0");
    check_field_offset(lv, s12199c3f1, 4, "S12199C3.s12199c3f1");
    check_field_offset(lv, s12199c3f2, 8, "S12199C3.s12199c3f2");
  }
}
static Arrange_To_Call_Me vS12199C3(Test_S12199C3, "S12199C3", 20);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12199C2  {
  char s12199c2f0[80];
  ::S12199C3 s12199c2f1[16];
  char s12199c2f2[94];
};
//SIG(-1 S12199C2) C1{ Fc[80] FC2{ Fi[2] Fc[9]}[16] Fc[94]}



static void Test_S12199C2()
{
  {
    init_simple_test("S12199C2");
    S12199C2 lv;
    check2(sizeof(lv), 496, "sizeof(S12199C2)");
    check2(__alignof__(lv), 4, "__alignof__(S12199C2)");
    check_field_offset(lv, s12199c2f0, 0, "S12199C2.s12199c2f0");
    check_field_offset(lv, s12199c2f1, 80, "S12199C2.s12199c2f1");
    check_field_offset(lv, s12199c2f2, 400, "S12199C2.s12199c2f2");
  }
}
static Arrange_To_Call_Me vS12199C2(Test_S12199C2, "S12199C2", 496);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12199C4_nt  {
  char s12199c4f0[16];
};
//SIG(1 S12199C4_nt) C1{ Fc[16]}



//skip512 S12199C4_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12199C1  {
  ::S12199C2 s12199c1f0;
  ::S12199C4_nt s12199c1f1[4];
  short s12199c1f2;
};
//SIG(1 S12199C1) C1{ FC2{ Fc[80] FC3{ Fi[2] Fc[9]}[16] Fc[94]} FC4{ Fc[16]}[4] Fs}



static void Test_S12199C1()
{
  {
    init_simple_test("S12199C1");
    S12199C1 lv;
    check2(sizeof(lv), 564, "sizeof(S12199C1)");
    check2(__alignof__(lv), 4, "__alignof__(S12199C1)");
    check_field_offset(lv, s12199c1f0, 0, "S12199C1.s12199c1f0");
    check_field_offset(lv, s12199c1f1, 496, "S12199C1.s12199c1f1");
    check_field_offset(lv, s12199c1f2, 560, "S12199C1.s12199c1f2");
  }
}
static Arrange_To_Call_Me vS12199C1(Test_S12199C1, "S12199C1", 564);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8354C2_nt  {
  void  mf8354c2(); // _ZN10S8354C2_nt8mf8354c2Ev
  virtual  ~S8354C2_nt(); // _ZN10S8354C2_ntD1Ev
  S8354C2_nt(); // tgen
};
//SIG(-1 S8354C2_nt) C1{ vd m}


void  S8354C2_nt ::mf8354c2(){}
 S8354C2_nt ::~S8354C2_nt(){ note_dtor("S8354C2_nt", this);}
S8354C2_nt ::S8354C2_nt(){ note_ctor("S8354C2_nt", this);} // tgen

//skip512 S8354C2_nt

#else // __cplusplus

extern void _ZN10S8354C2_ntC1Ev();
extern void _ZN10S8354C2_ntD1Ev();
Name_Map name_map_S8354C2_nt[] = {
  NSPAIR(_ZN10S8354C2_ntC1Ev),
  NSPAIR(_ZN10S8354C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S8354C2_nt[];
extern void _ZN10S8354C2_ntD1Ev();
extern void _ZN10S8354C2_ntD0Ev();
static  VTBL_ENTRY vtc_S8354C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S8354C2_nt[0]),
  (VTBL_ENTRY)&_ZN10S8354C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S8354C2_ntD0Ev,
};
extern VTBL_ENTRY _ZTI10S8354C2_nt[];
VTBL_ENTRY *P__ZTI10S8354C2_nt = _ZTI10S8354C2_nt; 
extern  VTBL_ENTRY _ZTV10S8354C2_nt[];
Class_Descriptor cd_S8354C2_nt = {  "S8354C2_nt", // class name
  0,0,//no base classes
  &(vtc_S8354C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI10S8354C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV10S8354C2_nt),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

struct  S8354C4_nt  {
  __tsi64 s8354c4f0;
  char s8354c4f1;
  void  mf8354c4(); // _ZN10S8354C4_nt8mf8354c4Ev
  virtual  ~S8354C4_nt(); // _ZN10S8354C4_ntD1Ev
  S8354C4_nt(); // tgen
};
//SIG(-1 S8354C4_nt) C1{ vd m FL Fc}


void  S8354C4_nt ::mf8354c4(){}
 S8354C4_nt ::~S8354C4_nt(){ note_dtor("S8354C4_nt", this);}
S8354C4_nt ::S8354C4_nt(){ note_ctor("S8354C4_nt", this);} // tgen

//skip512 S8354C4_nt

#else // __cplusplus

extern void _ZN10S8354C4_ntC1Ev();
extern void _ZN10S8354C4_ntD1Ev();
Name_Map name_map_S8354C4_nt[] = {
  NSPAIR(_ZN10S8354C4_ntC1Ev),
  NSPAIR(_ZN10S8354C4_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S8354C4_nt[];
extern void _ZN10S8354C4_ntD1Ev();
extern void _ZN10S8354C4_ntD0Ev();
static  VTBL_ENTRY vtc_S8354C4_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S8354C4_nt[0]),
  (VTBL_ENTRY)&_ZN10S8354C4_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S8354C4_ntD0Ev,
};
extern VTBL_ENTRY _ZTI10S8354C4_nt[];
VTBL_ENTRY *P__ZTI10S8354C4_nt = _ZTI10S8354C4_nt; 
extern  VTBL_ENTRY _ZTV10S8354C4_nt[];
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8354C3_nt  {
  ::S8354C4_nt s8354c3f0;
  ::S8354C4_nt s8354c3f1;
  void  mf8354c3(); // _ZN10S8354C3_nt8mf8354c3Ev
};
//SIG(-1 S8354C3_nt) C1{ m FC2{ vd m FL Fc} FC2}


void  S8354C3_nt ::mf8354c3(){}

//skip512 S8354C3_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8354C1  : S8354C2_nt {
  void *s8354c1f0;
  int s8354c1f1;
  ::S8354C3_nt s8354c1f2;
  ::S8354C3_nt s8354c1f3;
  long s8354c1f4;
  void *s8354c1f5;
  long s8354c1f6;
  void *s8354c1f7;
  virtual  ~S8354C1(); // _ZN7S8354C1D1Ev
  S8354C1(); // tgen
};
//SIG(1 S8354C1) C1{ BC2{ vd m} vd Fp Fi FC3{ m FC4{ vd m FL Fc} FC4} FC3 Fl Fp Fl Fp}


 S8354C1 ::~S8354C1(){ note_dtor("S8354C1", this);}
S8354C1 ::S8354C1(){ note_ctor("S8354C1", this);} // tgen

static void Test_S8354C1()
{
  extern Class_Descriptor cd_S8354C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(20,24)];
    init_test(&cd_S8354C1, buf);
    S8354C1 *dp, &lv = *(dp=new (buf) S8354C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(152,92), "sizeof(S8354C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8354C1)");
    check_base_class_offset(lv, (S8354C2_nt*), 0, "S8354C1");
    check_field_offset(lv, s8354c1f0, ABISELECT(8,4), "S8354C1.s8354c1f0");
    check_field_offset(lv, s8354c1f1, ABISELECT(16,8), "S8354C1.s8354c1f1");
    check_field_offset(lv, s8354c1f2, ABISELECT(24,12), "S8354C1.s8354c1f2");
    check_field_offset(lv, s8354c1f3, ABISELECT(72,44), "S8354C1.s8354c1f3");
    check_field_offset(lv, s8354c1f4, ABISELECT(120,76), "S8354C1.s8354c1f4");
    check_field_offset(lv, s8354c1f5, ABISELECT(128,80), "S8354C1.s8354c1f5");
    check_field_offset(lv, s8354c1f6, ABISELECT(136,84), "S8354C1.s8354c1f6");
    check_field_offset(lv, s8354c1f7, ABISELECT(144,88), "S8354C1.s8354c1f7");
    test_class_info(&lv, &cd_S8354C1);
    dp->~S8354C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8354C1(Test_S8354C1, "S8354C1", ABISELECT(152,92));

#else // __cplusplus

extern void _ZN7S8354C1C1Ev();
extern void _ZN7S8354C1D1Ev();
Name_Map name_map_S8354C1[] = {
  NSPAIR(_ZN7S8354C1C1Ev),
  NSPAIR(_ZN7S8354C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S8354C2_nt;
extern VTBL_ENTRY _ZTI10S8354C2_nt[];
extern  VTBL_ENTRY _ZTV10S8354C2_nt[];
static Base_Class bases_S8354C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S8354C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8354C1[];
extern void _ZN7S8354C1D1Ev();
extern void _ZN7S8354C1D0Ev();
static  VTBL_ENTRY vtc_S8354C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8354C1[0]),
  (VTBL_ENTRY)&_ZN7S8354C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8354C1D0Ev,
};
extern VTBL_ENTRY _ZTI7S8354C1[];
extern  VTBL_ENTRY _ZTV7S8354C1[];
Class_Descriptor cd_S8354C1 = {  "S8354C1", // class name
  bases_S8354C1, 1,
  &(vtc_S8354C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(152,92), // object size
  NSPAIRA(_ZTI7S8354C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8354C1),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9548C2  {
  virtual  ~S9548C2(); // _ZN7S9548C2D1Ev
  virtual void  v3(); // _ZN7S9548C22v3Ev
  virtual void  v4(); // _ZN7S9548C22v4Ev
  S9548C2(); // tgen
};
//SIG(-1 S9548C2) C1{ vd v1 v2}


 S9548C2 ::~S9548C2(){ note_dtor("S9548C2", this);}
void  S9548C2 ::v3(){vfunc_called(this, "_ZN7S9548C22v3Ev");}
void  S9548C2 ::v4(){vfunc_called(this, "_ZN7S9548C22v4Ev");}
S9548C2 ::S9548C2(){ note_ctor("S9548C2", this);} // tgen

static void Test_S9548C2()
{
  extern Class_Descriptor cd_S9548C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S9548C2, buf);
    S9548C2 *dp, &lv = *(dp=new (buf) S9548C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S9548C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9548C2)");
    test_class_info(&lv, &cd_S9548C2);
    dp->~S9548C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9548C2(Test_S9548C2, "S9548C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN7S9548C2C1Ev();
extern void _ZN7S9548C2D1Ev();
Name_Map name_map_S9548C2[] = {
  NSPAIR(_ZN7S9548C2C1Ev),
  NSPAIR(_ZN7S9548C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9548C2[];
extern void _ZN7S9548C2D1Ev();
extern void _ZN7S9548C2D0Ev();
extern void _ZN7S9548C22v3Ev();
extern void _ZN7S9548C22v4Ev();
static  VTBL_ENTRY vtc_S9548C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9548C2[0]),
  (VTBL_ENTRY)&_ZN7S9548C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9548C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9548C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9548C22v4Ev,
};
extern VTBL_ENTRY _ZTI7S9548C2[];
extern  VTBL_ENTRY _ZTV7S9548C2[];
Class_Descriptor cd_S9548C2 = {  "S9548C2", // class name
  0,0,//no base classes
  &(vtc_S9548C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI7S9548C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9548C2),6, //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

struct  S9548C1  : S9548C2 {
  ::S10103C14_nt s9548c1f0;
  __tsi64 s9548c1f1;
  ::S10103C111_nt s9548c1f2;
  void *s9548c1f3;
  char s9548c1f4;
  virtual void  v1(); // _ZN7S9548C12v1Ev
  virtual void  v2(); // _ZN7S9548C12v2Ev
  ~S9548C1(); // tgen
  S9548C1(); // tgen
};
//SIG(1 S9548C1) C1{ BC2{ vd v3 v4} v1 v2 FC3{ m Fp Fi FC4{ m}} FL FC5{ m Fp[2]} Fp Fc}


void  S9548C1 ::v1(){vfunc_called(this, "_ZN7S9548C12v1Ev");}
void  S9548C1 ::v2(){vfunc_called(this, "_ZN7S9548C12v2Ev");}
S9548C1 ::~S9548C1(){ note_dtor("S9548C1", this);} // tgen
S9548C1 ::S9548C1(){ note_ctor("S9548C1", this);} // tgen

static void Test_S9548C1()
{
  extern Class_Descriptor cd_S9548C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S9548C1, buf);
    S9548C1 *dp, &lv = *(dp=new (buf) S9548C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S9548C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9548C1)");
    check_base_class_offset(lv, (S9548C2*), 0, "S9548C1");
    check_field_offset(lv, s9548c1f0, ABISELECT(8,4), "S9548C1.s9548c1f0");
    check_field_offset(lv, s9548c1f1, ABISELECT(24,16), "S9548C1.s9548c1f1");
    check_field_offset(lv, s9548c1f2, ABISELECT(32,24), "S9548C1.s9548c1f2");
    check_field_offset(lv, s9548c1f3, ABISELECT(48,32), "S9548C1.s9548c1f3");
    check_field_offset(lv, s9548c1f4, ABISELECT(56,36), "S9548C1.s9548c1f4");
    test_class_info(&lv, &cd_S9548C1);
    dp->~S9548C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9548C1(Test_S9548C1, "S9548C1", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7S9548C1C1Ev();
extern void _ZN7S9548C1D1Ev();
Name_Map name_map_S9548C1[] = {
  NSPAIR(_ZN7S9548C1C1Ev),
  NSPAIR(_ZN7S9548C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9548C2;
extern VTBL_ENTRY _ZTI7S9548C2[];
extern  VTBL_ENTRY _ZTV7S9548C2[];
static Base_Class bases_S9548C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9548C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9548C1[];
extern void _ZN7S9548C1D1Ev();
extern void _ZN7S9548C1D0Ev();
extern void _ZN7S9548C22v3Ev();
extern void _ZN7S9548C22v4Ev();
extern void _ZN7S9548C12v1Ev();
extern void _ZN7S9548C12v2Ev();
static  VTBL_ENTRY vtc_S9548C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9548C1[0]),
  (VTBL_ENTRY)&_ZN7S9548C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9548C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9548C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9548C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9548C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9548C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9548C1[];
extern  VTBL_ENTRY _ZTV7S9548C1[];
Class_Descriptor cd_S9548C1 = {  "S9548C1", // class name
  bases_S9548C1, 1,
  &(vtc_S9548C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7S9548C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9548C1),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9534C2  {
  virtual  ~S9534C2(); // _ZN7S9534C2D1Ev
  virtual void  v3(); // _ZN7S9534C22v3Ev
  virtual void  v4(); // _ZN7S9534C22v4Ev
  S9534C2(); // tgen
};
//SIG(-1 S9534C2) C1{ vd v1 v2}


 S9534C2 ::~S9534C2(){ note_dtor("S9534C2", this);}
void  S9534C2 ::v3(){vfunc_called(this, "_ZN7S9534C22v3Ev");}
void  S9534C2 ::v4(){vfunc_called(this, "_ZN7S9534C22v4Ev");}
S9534C2 ::S9534C2(){ note_ctor("S9534C2", this);} // tgen

static void Test_S9534C2()
{
  extern Class_Descriptor cd_S9534C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S9534C2, buf);
    S9534C2 *dp, &lv = *(dp=new (buf) S9534C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S9534C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9534C2)");
    test_class_info(&lv, &cd_S9534C2);
    dp->~S9534C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9534C2(Test_S9534C2, "S9534C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN7S9534C2C1Ev();
extern void _ZN7S9534C2D1Ev();
Name_Map name_map_S9534C2[] = {
  NSPAIR(_ZN7S9534C2C1Ev),
  NSPAIR(_ZN7S9534C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9534C2[];
extern void _ZN7S9534C2D1Ev();
extern void _ZN7S9534C2D0Ev();
extern void _ZN7S9534C22v3Ev();
extern void _ZN7S9534C22v4Ev();
static  VTBL_ENTRY vtc_S9534C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9534C2[0]),
  (VTBL_ENTRY)&_ZN7S9534C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9534C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9534C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9534C22v4Ev,
};
extern VTBL_ENTRY _ZTI7S9534C2[];
extern  VTBL_ENTRY _ZTV7S9534C2[];
Class_Descriptor cd_S9534C2 = {  "S9534C2", // class name
  0,0,//no base classes
  &(vtc_S9534C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI7S9534C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9534C2),6, //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

struct  S9534C1  : S9534C2 {
  ::S10103C66 s9534c1f0;
  virtual void  v1(); // _ZN7S9534C12v1Ev
  virtual void  v2(); // _ZN7S9534C12v2Ev
  ~S9534C1(); // tgen
  S9534C1(); // tgen
};
//SIG(1 S9534C1) C1{ BC2{ vd v3 v4} v1 v2 FC3{ BC4{ vd v5 v6} FC5{ m Fp Fi FC6{ m}} Fi FL[2] Fi}}


void  S9534C1 ::v1(){vfunc_called(this, "_ZN7S9534C12v1Ev");}
void  S9534C1 ::v2(){vfunc_called(this, "_ZN7S9534C12v2Ev");}
S9534C1 ::~S9534C1(){ note_dtor("S9534C1", this);} // tgen
S9534C1 ::S9534C1(){ note_ctor("S9534C1", this);} // tgen

static void Test_S9534C1()
{
  extern Class_Descriptor cd_S9534C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_S9534C1, buf);
    S9534C1 *dp, &lv = *(dp=new (buf) S9534C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(S9534C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9534C1)");
    check_base_class_offset(lv, (S9534C2*), 0, "S9534C1");
    check_field_offset(lv, s9534c1f0, ABISELECT(8,4), "S9534C1.s9534c1f0");
    test_class_info(&lv, &cd_S9534C1);
    dp->~S9534C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9534C1(Test_S9534C1, "S9534C1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7S9534C1C1Ev();
extern void _ZN7S9534C1D1Ev();
Name_Map name_map_S9534C1[] = {
  NSPAIR(_ZN7S9534C1C1Ev),
  NSPAIR(_ZN7S9534C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9534C2;
extern VTBL_ENTRY _ZTI7S9534C2[];
extern  VTBL_ENTRY _ZTV7S9534C2[];
static Base_Class bases_S9534C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9534C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9534C1[];
extern void _ZN7S9534C1D1Ev();
extern void _ZN7S9534C1D0Ev();
extern void _ZN7S9534C22v3Ev();
extern void _ZN7S9534C22v4Ev();
extern void _ZN7S9534C12v1Ev();
extern void _ZN7S9534C12v2Ev();
static  VTBL_ENTRY vtc_S9534C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9534C1[0]),
  (VTBL_ENTRY)&_ZN7S9534C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9534C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9534C22v3Ev,
  (VTBL_ENTRY)&_ZN7S9534C22v4Ev,
  (VTBL_ENTRY)&_ZN7S9534C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9534C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9534C1[];
extern  VTBL_ENTRY _ZTV7S9534C1[];
Class_Descriptor cd_S9534C1 = {  "S9534C1", // class name
  bases_S9534C1, 1,
  &(vtc_S9534C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7S9534C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9534C1),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S19298C3  {
  char s19298c3f0;
  void *s19298c3f1;
  __tsi64 s19298c3f2;
  void *s19298c3f3;
  virtual void  v2(); // _ZN8S19298C32v2Ev
  virtual void  v3(); // _ZN8S19298C32v3Ev
  virtual void  v4(); // _ZN8S19298C32v4Ev
  virtual void  v5(); // _ZN8S19298C32v5Ev
  ~S19298C3(); // tgen
  S19298C3(); // tgen
};
//SIG(-1 S19298C3) C1{ v1 v2 v3 v4 Fc Fp FL Fp}


void  S19298C3 ::v2(){vfunc_called(this, "_ZN8S19298C32v2Ev");}
void  S19298C3 ::v3(){vfunc_called(this, "_ZN8S19298C32v3Ev");}
void  S19298C3 ::v4(){vfunc_called(this, "_ZN8S19298C32v4Ev");}
void  S19298C3 ::v5(){vfunc_called(this, "_ZN8S19298C32v5Ev");}
S19298C3 ::~S19298C3(){ note_dtor("S19298C3", this);} // tgen
S19298C3 ::S19298C3(){ note_ctor("S19298C3", this);} // tgen

static void Test_S19298C3()
{
  extern Class_Descriptor cd_S19298C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_S19298C3, buf);
    S19298C3 *dp, &lv = *(dp=new (buf) S19298C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(S19298C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S19298C3)");
    check_field_offset(lv, s19298c3f0, ABISELECT(8,4), "S19298C3.s19298c3f0");
    check_field_offset(lv, s19298c3f1, ABISELECT(16,8), "S19298C3.s19298c3f1");
    check_field_offset(lv, s19298c3f2, ABISELECT(24,12), "S19298C3.s19298c3f2");
    check_field_offset(lv, s19298c3f3, ABISELECT(32,20), "S19298C3.s19298c3f3");
    test_class_info(&lv, &cd_S19298C3);
    dp->~S19298C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS19298C3(Test_S19298C3, "S19298C3", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN8S19298C3C1Ev();
extern void _ZN8S19298C3D1Ev();
Name_Map name_map_S19298C3[] = {
  NSPAIR(_ZN8S19298C3C1Ev),
  NSPAIR(_ZN8S19298C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S19298C3[];
extern void _ZN8S19298C32v2Ev();
extern void _ZN8S19298C32v3Ev();
extern void _ZN8S19298C32v4Ev();
extern void _ZN8S19298C32v5Ev();
static  VTBL_ENTRY vtc_S19298C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S19298C3[0]),
  (VTBL_ENTRY)&_ZN8S19298C32v2Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v3Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v4Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v5Ev,
};
extern VTBL_ENTRY _ZTI8S19298C3[];
extern  VTBL_ENTRY _ZTV8S19298C3[];
Class_Descriptor cd_S19298C3 = {  "S19298C3", // class name
  0,0,//no base classes
  &(vtc_S19298C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI8S19298C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S19298C3),6, //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

struct  S19298C2  : S19298C3 {
  char s19298c2f0;
  ::S19298C3 s19298c2f1;
  int s19298c2f2[3];
  virtual void  v6(); // _ZN8S19298C22v6Ev
  ~S19298C2(); // tgen
  S19298C2(); // tgen
};
//SIG(-1 S19298C2) C1{ BC2{ v2 v3 v4 v5 Fc Fp FL Fp} v1 Fc FC2 Fi[3]}


void  S19298C2 ::v6(){vfunc_called(this, "_ZN8S19298C22v6Ev");}
S19298C2 ::~S19298C2(){ note_dtor("S19298C2", this);} // tgen
S19298C2 ::S19298C2(){ note_ctor("S19298C2", this);} // tgen

static void Test_S19298C2()
{
  extern Class_Descriptor cd_S19298C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(14,17)];
    init_test(&cd_S19298C2, buf);
    S19298C2 *dp, &lv = *(dp=new (buf) S19298C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(104,64), "sizeof(S19298C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S19298C2)");
    check_base_class_offset(lv, (S19298C3*), 0, "S19298C2");
    check_field_offset(lv, s19298c2f0, ABISELECT(40,24), "S19298C2.s19298c2f0");
    check_field_offset(lv, s19298c2f1, ABISELECT(48,28), "S19298C2.s19298c2f1");
    check_field_offset(lv, s19298c2f2, ABISELECT(88,52), "S19298C2.s19298c2f2");
    test_class_info(&lv, &cd_S19298C2);
    dp->~S19298C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS19298C2(Test_S19298C2, "S19298C2", ABISELECT(104,64));

#else // __cplusplus

extern void _ZN8S19298C2C1Ev();
extern void _ZN8S19298C2D1Ev();
Name_Map name_map_S19298C2[] = {
  NSPAIR(_ZN8S19298C2C1Ev),
  NSPAIR(_ZN8S19298C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S19298C3;
extern VTBL_ENTRY _ZTI8S19298C3[];
extern  VTBL_ENTRY _ZTV8S19298C3[];
static Base_Class bases_S19298C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S19298C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S19298C2[];
extern void _ZN8S19298C32v2Ev();
extern void _ZN8S19298C32v3Ev();
extern void _ZN8S19298C32v4Ev();
extern void _ZN8S19298C32v5Ev();
extern void _ZN8S19298C22v6Ev();
static  VTBL_ENTRY vtc_S19298C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S19298C2[0]),
  (VTBL_ENTRY)&_ZN8S19298C32v2Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v3Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v4Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v5Ev,
  (VTBL_ENTRY)&_ZN8S19298C22v6Ev,
};
extern VTBL_ENTRY _ZTI8S19298C2[];
extern  VTBL_ENTRY _ZTV8S19298C2[];
Class_Descriptor cd_S19298C2 = {  "S19298C2", // class name
  bases_S19298C2, 1,
  &(vtc_S19298C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(104,64), // object size
  NSPAIRA(_ZTI8S19298C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV8S19298C2),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S19298C1  : virtual S19298C2 {
  ::S19298C2 s19298c1f0;
  virtual void  v1(); // _ZN8S19298C12v1Ev
  ~S19298C1(); // tgen
  S19298C1(); // tgen
};
//SIG(1 S19298C1) C1{ VBC2{ BC3{ v2 v3 v4 v5 Fc Fp FL Fp} v6 Fc FC3 Fi[3]} v1 FC2}


void  S19298C1 ::v1(){vfunc_called(this, "_ZN8S19298C12v1Ev");}
S19298C1 ::~S19298C1(){ note_dtor("S19298C1", this);} // tgen
S19298C1 ::S19298C1(){ note_ctor("S19298C1", this);} // tgen

static void Test_S19298C1()
{
  extern Class_Descriptor cd_S19298C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(28,34)];
    init_test(&cd_S19298C1, buf);
    S19298C1 *dp, &lv = *(dp=new (buf) S19298C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(216,132), "sizeof(S19298C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S19298C1)");
    check_base_class_offset(lv, (S19298C3*)(S19298C2*), ABISELECT(112,68), "S19298C1");
    check_base_class_offset(lv, (S19298C2*), ABISELECT(112,68), "S19298C1");
    check_field_offset(lv, s19298c1f0, ABISELECT(8,4), "S19298C1.s19298c1f0");
    test_class_info(&lv, &cd_S19298C1);
    dp->~S19298C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS19298C1(Test_S19298C1, "S19298C1", ABISELECT(216,132));

#else // __cplusplus

extern void _ZN8S19298C1C1Ev();
extern void _ZN8S19298C1D1Ev();
Name_Map name_map_S19298C1[] = {
  NSPAIR(_ZN8S19298C1C1Ev),
  NSPAIR(_ZN8S19298C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S19298C3;
extern VTBL_ENTRY _ZTI8S19298C3[];
extern  VTBL_ENTRY _ZTV8S19298C3[];
extern Class_Descriptor cd_S19298C2;
extern VTBL_ENTRY _ZTI8S19298C2[];
extern  VTBL_ENTRY _ZTV8S19298C2[];
static Base_Class bases_S19298C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S19298C3,    ABISELECT(112,68), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S19298C2,    ABISELECT(112,68), //bcp->offset
    4, //bcp->virtual_function_table_offset
    7, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8S19298C1[];
extern void _ZN8S19298C12v1Ev();
extern void _ZN8S19298C32v2Ev();
extern void _ZN8S19298C32v3Ev();
extern void _ZN8S19298C32v4Ev();
extern void _ZN8S19298C32v5Ev();
extern void _ZN8S19298C22v6Ev();
static  VTBL_ENTRY vtc_S19298C1[] = {
  ABISELECT(112,68),
  0,
  (VTBL_ENTRY)&(_ZTI8S19298C1[0]),
  (VTBL_ENTRY)&_ZN8S19298C12v1Ev,
  0,
  0,
  0,
  0,
  0,
  ABISELECT(-112,-68),
  (VTBL_ENTRY)&(_ZTI8S19298C1[0]),
  (VTBL_ENTRY)&_ZN8S19298C32v2Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v3Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v4Ev,
  (VTBL_ENTRY)&_ZN8S19298C32v5Ev,
  (VTBL_ENTRY)&_ZN8S19298C22v6Ev,
};
extern VTBL_ENTRY _ZTV8S19298C1[];
static  VTT_ENTRY vtt_S19298C1[] = {
  {&(_ZTV8S19298C1[3]),  3,16},
  {&(_ZTV8S19298C1[11]),  11,16},
};
extern VTBL_ENTRY _ZTI8S19298C1[];
extern  VTBL_ENTRY _ZTV8S19298C1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8S19298C1[];
Class_Descriptor cd_S19298C1 = {  "S19298C1", // class name
  bases_S19298C1, 2,
  &(vtc_S19298C1[0]), // expected_vtbl_contents
  &(vtt_S19298C1[0]), // expected_vtt_contents
  ABISELECT(216,132), // object size
  NSPAIRA(_ZTI8S19298C1),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV8S19298C1),16, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8S19298C1),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15477C3  {
  ::S10103C14_nt s15477c3f0;
  int s15477c3f1;
  void *s15477c3f2[4];
  int s15477c3f3;
  void  mf15477c3(); // _ZN8S15477C39mf15477c3Ev
  virtual  ~S15477C3(); // _ZN8S15477C3D1Ev
  S15477C3(); // tgen
};
//SIG(-1 S15477C3) C1{ vd m FC2{ m Fp Fi FC3{ m}} Fi Fp[4] Fi}


void  S15477C3 ::mf15477c3(){}
 S15477C3 ::~S15477C3(){ note_dtor("S15477C3", this);}
S15477C3 ::S15477C3(){ note_ctor("S15477C3", this);} // tgen

static void Test_S15477C3()
{
  extern Class_Descriptor cd_S15477C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,11)];
    init_test(&cd_S15477C3, buf);
    S15477C3 *dp, &lv = *(dp=new (buf) S15477C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,40), "sizeof(S15477C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15477C3)");
    check_field_offset(lv, s15477c3f0, ABISELECT(8,4), "S15477C3.s15477c3f0");
    check_field_offset(lv, s15477c3f1, ABISELECT(24,16), "S15477C3.s15477c3f1");
    check_field_offset(lv, s15477c3f2, ABISELECT(32,20), "S15477C3.s15477c3f2");
    check_field_offset(lv, s15477c3f3, ABISELECT(64,36), "S15477C3.s15477c3f3");
    test_class_info(&lv, &cd_S15477C3);
    dp->~S15477C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS15477C3(Test_S15477C3, "S15477C3", ABISELECT(72,40));

#else // __cplusplus

extern void _ZN8S15477C3C1Ev();
extern void _ZN8S15477C3D1Ev();
Name_Map name_map_S15477C3[] = {
  NSPAIR(_ZN8S15477C3C1Ev),
  NSPAIR(_ZN8S15477C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S15477C3[];
extern void _ZN8S15477C3D1Ev();
extern void _ZN8S15477C3D0Ev();
static  VTBL_ENTRY vtc_S15477C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S15477C3[0]),
  (VTBL_ENTRY)&_ZN8S15477C3D1Ev,
  (VTBL_ENTRY)&_ZN8S15477C3D0Ev,
};
extern VTBL_ENTRY _ZTI8S15477C3[];
extern  VTBL_ENTRY _ZTV8S15477C3[];
Class_Descriptor cd_S15477C3 = {  "S15477C3", // class name
  0,0,//no base classes
  &(vtc_S15477C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,40), // object size
  NSPAIRA(_ZTI8S15477C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S15477C3),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15477C2  : S15477C3 {
  int s15477c2f0;
  void *s15477c2f1;
  virtual  ~S15477C2(); // _ZN8S15477C2D1Ev
  S15477C2(); // tgen
};
//SIG(-1 S15477C2) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m}} Fi Fp[4] Fi} vd Fi Fp}


 S15477C2 ::~S15477C2(){ note_dtor("S15477C2", this);}
S15477C2 ::S15477C2(){ note_ctor("S15477C2", this);} // tgen

static void Test_S15477C2()
{
  extern Class_Descriptor cd_S15477C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_S15477C2, buf);
    S15477C2 *dp, &lv = *(dp=new (buf) S15477C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(S15477C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15477C2)");
    check_base_class_offset(lv, (S15477C3*), 0, "S15477C2");
    check_field_offset(lv, s15477c2f0, ABISELECT(68,40), "S15477C2.s15477c2f0");
    check_field_offset(lv, s15477c2f1, ABISELECT(72,44), "S15477C2.s15477c2f1");
    test_class_info(&lv, &cd_S15477C2);
    dp->~S15477C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS15477C2(Test_S15477C2, "S15477C2", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8S15477C2C1Ev();
extern void _ZN8S15477C2D1Ev();
Name_Map name_map_S15477C2[] = {
  NSPAIR(_ZN8S15477C2C1Ev),
  NSPAIR(_ZN8S15477C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S15477C3;
extern VTBL_ENTRY _ZTI8S15477C3[];
extern  VTBL_ENTRY _ZTV8S15477C3[];
static Base_Class bases_S15477C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S15477C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S15477C2[];
extern void _ZN8S15477C2D1Ev();
extern void _ZN8S15477C2D0Ev();
static  VTBL_ENTRY vtc_S15477C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S15477C2[0]),
  (VTBL_ENTRY)&_ZN8S15477C2D1Ev,
  (VTBL_ENTRY)&_ZN8S15477C2D0Ev,
};
extern VTBL_ENTRY _ZTI8S15477C2[];
extern  VTBL_ENTRY _ZTV8S15477C2[];
Class_Descriptor cd_S15477C2 = {  "S15477C2", // class name
  bases_S15477C2, 1,
  &(vtc_S15477C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8S15477C2),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV8S15477C2),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15477C1  {
  ::S15477C2 s15477c1f0;
  void  mf15477c1(); // _ZN8S15477C19mf15477c1Ev
};
//SIG(1 S15477C1) C1{ m FC2{ BC3{ vd m FC4{ m Fp Fi FC5{ m}} Fi Fp[4] Fi} vd Fi Fp}}


void  S15477C1 ::mf15477c1(){}

static void Test_S15477C1()
{
  {
    init_simple_test("S15477C1");
    S15477C1 lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(S15477C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15477C1)");
    check_field_offset(lv, s15477c1f0, 0, "S15477C1.s15477c1f0");
  }
}
static Arrange_To_Call_Me vS15477C1(Test_S15477C1, "S15477C1", ABISELECT(80,48));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S18211C2_nt  {
  int s18211c2f0;
  ::S16172C5_nt s18211c2f1;
  void  mf18211c2(); // _ZN11S18211C2_nt9mf18211c2Ev
};
//SIG(-1 S18211C2_nt) C1{ m Fi FC2{ BC3{ m Fp Fi FC4{ m} FC4}}}


void  S18211C2_nt ::mf18211c2(){}

//skip512 S18211C2_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S18211C1  {
  void *s18211c1f0[3];
  ::S18211C2_nt s18211c1f1;
  char s18211c1f2[2];
  void  mf18211c1(); // _ZN8S18211C19mf18211c1Ev
};
//SIG(1 S18211C1) C1{ m Fp[3] FC2{ m Fi FC3{ BC4{ m Fp Fi FC5{ m} FC5}}} Fc[2]}


void  S18211C1 ::mf18211c1(){}

static void Test_S18211C1()
{
  {
    init_simple_test("S18211C1");
    S18211C1 lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(S18211C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18211C1)");
    check_field_offset(lv, s18211c1f0, 0, "S18211C1.s18211c1f0");
    check_field_offset(lv, s18211c1f1, ABISELECT(24,12), "S18211C1.s18211c1f1");
    check_field_offset(lv, s18211c1f2, ABISELECT(48,28), "S18211C1.s18211c1f2");
  }
}
static Arrange_To_Call_Me vS18211C1(Test_S18211C1, "S18211C1", ABISELECT(56,32));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9095C2  {
  virtual  ~S9095C2(); // _ZN7S9095C2D1Ev
  virtual void  v2(); // _ZN7S9095C22v2Ev
  S9095C2(); // tgen
};
//SIG(-1 S9095C2) C1{ vd v1}


 S9095C2 ::~S9095C2(){ note_dtor("S9095C2", this);}
void  S9095C2 ::v2(){vfunc_called(this, "_ZN7S9095C22v2Ev");}
S9095C2 ::S9095C2(){ note_ctor("S9095C2", this);} // tgen

static void Test_S9095C2()
{
  extern Class_Descriptor cd_S9095C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S9095C2, buf);
    S9095C2 *dp, &lv = *(dp=new (buf) S9095C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S9095C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9095C2)");
    test_class_info(&lv, &cd_S9095C2);
    dp->~S9095C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9095C2(Test_S9095C2, "S9095C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN7S9095C2C1Ev();
extern void _ZN7S9095C2D1Ev();
Name_Map name_map_S9095C2[] = {
  NSPAIR(_ZN7S9095C2C1Ev),
  NSPAIR(_ZN7S9095C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S9095C2[];
extern void _ZN7S9095C2D1Ev();
extern void _ZN7S9095C2D0Ev();
extern void _ZN7S9095C22v2Ev();
static  VTBL_ENTRY vtc_S9095C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9095C2[0]),
  (VTBL_ENTRY)&_ZN7S9095C2D1Ev,
  (VTBL_ENTRY)&_ZN7S9095C2D0Ev,
  (VTBL_ENTRY)&_ZN7S9095C22v2Ev,
};
extern VTBL_ENTRY _ZTI7S9095C2[];
extern  VTBL_ENTRY _ZTV7S9095C2[];
Class_Descriptor cd_S9095C2 = {  "S9095C2", // class name
  0,0,//no base classes
  &(vtc_S9095C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI7S9095C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S9095C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9095C3  {
  void *s9095c3f0;
  ::S10103C111_nt s9095c3f1;
  void *s9095c3f2;
  char s9095c3f3;
  void *s9095c3f4[2];
  void  mf9095c3(); // _ZN7S9095C38mf9095c3Ev
};
//SIG(-1 S9095C3) C1{ m Fp FC2{ m Fp[2]} Fp Fc Fp[2]}


void  S9095C3 ::mf9095c3(){}

static void Test_S9095C3()
{
  {
    init_simple_test("S9095C3");
    S9095C3 lv;
    check2(sizeof(lv), ABISELECT(56,28), "sizeof(S9095C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9095C3)");
    check_field_offset(lv, s9095c3f0, 0, "S9095C3.s9095c3f0");
    check_field_offset(lv, s9095c3f1, ABISELECT(8,4), "S9095C3.s9095c3f1");
    check_field_offset(lv, s9095c3f2, ABISELECT(24,12), "S9095C3.s9095c3f2");
    check_field_offset(lv, s9095c3f3, ABISELECT(32,16), "S9095C3.s9095c3f3");
    check_field_offset(lv, s9095c3f4, ABISELECT(40,20), "S9095C3.s9095c3f4");
  }
}
static Arrange_To_Call_Me vS9095C3(Test_S9095C3, "S9095C3", ABISELECT(56,28));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9095C1  : S9095C2 {
  void *s9095c1f0;
  ::S9095C3 s9095c1f1;
  virtual  ~S9095C1(); // _ZN7S9095C1D1Ev
  virtual void  v1(); // _ZN7S9095C12v1Ev
  S9095C1(); // tgen
};
//SIG(1 S9095C1) C1{ BC2{ vd v2} vd v1 Fp FC3{ m Fp FC4{ m Fp[2]} Fp Fc Fp[2]}}


 S9095C1 ::~S9095C1(){ note_dtor("S9095C1", this);}
void  S9095C1 ::v1(){vfunc_called(this, "_ZN7S9095C12v1Ev");}
S9095C1 ::S9095C1(){ note_ctor("S9095C1", this);} // tgen

static void Test_S9095C1()
{
  extern Class_Descriptor cd_S9095C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[10];
    init_test(&cd_S9095C1, buf);
    S9095C1 *dp, &lv = *(dp=new (buf) S9095C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,36), "sizeof(S9095C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9095C1)");
    check_base_class_offset(lv, (S9095C2*), 0, "S9095C1");
    check_field_offset(lv, s9095c1f0, ABISELECT(8,4), "S9095C1.s9095c1f0");
    check_field_offset(lv, s9095c1f1, ABISELECT(16,8), "S9095C1.s9095c1f1");
    test_class_info(&lv, &cd_S9095C1);
    dp->~S9095C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9095C1(Test_S9095C1, "S9095C1", ABISELECT(72,36));

#else // __cplusplus

extern void _ZN7S9095C1C1Ev();
extern void _ZN7S9095C1D1Ev();
Name_Map name_map_S9095C1[] = {
  NSPAIR(_ZN7S9095C1C1Ev),
  NSPAIR(_ZN7S9095C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9095C2;
extern VTBL_ENTRY _ZTI7S9095C2[];
extern  VTBL_ENTRY _ZTV7S9095C2[];
static Base_Class bases_S9095C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9095C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9095C1[];
extern void _ZN7S9095C1D1Ev();
extern void _ZN7S9095C1D0Ev();
extern void _ZN7S9095C22v2Ev();
extern void _ZN7S9095C12v1Ev();
static  VTBL_ENTRY vtc_S9095C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9095C1[0]),
  (VTBL_ENTRY)&_ZN7S9095C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9095C1D0Ev,
  (VTBL_ENTRY)&_ZN7S9095C22v2Ev,
  (VTBL_ENTRY)&_ZN7S9095C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S9095C1[];
extern  VTBL_ENTRY _ZTV7S9095C1[];
Class_Descriptor cd_S9095C1 = {  "S9095C1", // class name
  bases_S9095C1, 1,
  &(vtc_S9095C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,36), // object size
  NSPAIRA(_ZTI7S9095C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9095C1),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S21445C1  {
  ::S10103C86 s21445c1f0;
  ::S10102C22_nt s21445c1f1;
  char s21445c1f2;
  int s21445c1f3;
  void  mf21445c1(); // _ZN8S21445C19mf21445c1Ev
  virtual  ~S21445C1(); // _ZN8S21445C1D1Ev
  S21445C1(); // tgen
};
//SIG(1 S21445C1) C1{ vd m FC2{ m Fp Fi FC3{ m} FC4{ m}} FC5{ m FC6{ Fl[4]}} Fc Fi}


void  S21445C1 ::mf21445c1(){}
 S21445C1 ::~S21445C1(){ note_dtor("S21445C1", this);}
S21445C1 ::S21445C1(){ note_ctor("S21445C1", this);} // tgen

static void Test_S21445C1()
{
  extern Class_Descriptor cd_S21445C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_S21445C1, buf);
    S21445C1 *dp, &lv = *(dp=new (buf) S21445C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(S21445C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21445C1)");
    check_field_offset(lv, s21445c1f0, ABISELECT(8,4), "S21445C1.s21445c1f0");
    check_field_offset(lv, s21445c1f1, ABISELECT(24,16), "S21445C1.s21445c1f1");
    check_field_offset(lv, s21445c1f2, ABISELECT(56,32), "S21445C1.s21445c1f2");
    check_field_offset(lv, s21445c1f3, ABISELECT(60,36), "S21445C1.s21445c1f3");
    test_class_info(&lv, &cd_S21445C1);
    dp->~S21445C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS21445C1(Test_S21445C1, "S21445C1", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8S21445C1C1Ev();
extern void _ZN8S21445C1D1Ev();
Name_Map name_map_S21445C1[] = {
  NSPAIR(_ZN8S21445C1C1Ev),
  NSPAIR(_ZN8S21445C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S21445C1[];
extern void _ZN8S21445C1D1Ev();
extern void _ZN8S21445C1D0Ev();
static  VTBL_ENTRY vtc_S21445C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S21445C1[0]),
  (VTBL_ENTRY)&_ZN8S21445C1D1Ev,
  (VTBL_ENTRY)&_ZN8S21445C1D0Ev,
};
extern VTBL_ENTRY _ZTI8S21445C1[];
extern  VTBL_ENTRY _ZTV8S21445C1[];
Class_Descriptor cd_S21445C1 = {  "S21445C1", // class name
  0,0,//no base classes
  &(vtc_S21445C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8S21445C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S21445C1),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15016C4  : S6683C5_nt {
};
//SIG(-1 S15016C4) C1{ BC2{ m Fp Fi[2]}}



static void Test_S15016C4()
{
  extern Class_Descriptor cd_S15016C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(3,4)];
    init_test(&cd_S15016C4, buf);
    S15016C4 &lv = *(new (buf) S15016C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(S15016C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15016C4)");
    check_base_class_offset(lv, (S6683C5_nt*), 0, "S15016C4");
    test_class_info(&lv, &cd_S15016C4);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS15016C4(Test_S15016C4, "S15016C4", ABISELECT(16,12));

#else // __cplusplus

extern Class_Descriptor cd_S6683C5_nt;
static Base_Class bases_S15016C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S15016C4 = {  "S15016C4", // class name
  bases_S15016C4, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(16,12), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15016C3_nt  : S15016C4 {
};
//SIG(-1 S15016C3_nt) C1{ BC2{ BC3{ m Fp Fi[2]}}}



//skip512 S15016C3_nt

#else // __cplusplus

extern Class_Descriptor cd_S6683C5_nt;
extern Class_Descriptor cd_S15016C4;
static Base_Class bases_S15016C3_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S15016C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S15016C3_nt = {  "S15016C3_nt", // class name
  bases_S15016C3_nt, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(16,12), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15016C2_nt  : S15016C3_nt {
};
//SIG(-1 S15016C2_nt) C1{ BC2{ BC3{ BC4{ m Fp Fi[2]}}}}



//skip512 S15016C2_nt

#else // __cplusplus

extern Class_Descriptor cd_S6683C5_nt;
extern Class_Descriptor cd_S15016C4;
extern Class_Descriptor cd_S15016C3_nt;
static Base_Class bases_S15016C2_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S15016C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_S15016C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15016C7  : S6683C5_nt {
};
//SIG(-1 S15016C7) C1{ BC2{ m Fp Fi[2]}}



static void Test_S15016C7()
{
  extern Class_Descriptor cd_S15016C7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(3,4)];
    init_test(&cd_S15016C7, buf);
    S15016C7 &lv = *(new (buf) S15016C7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(S15016C7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15016C7)");
    check_base_class_offset(lv, (S6683C5_nt*), 0, "S15016C7");
    test_class_info(&lv, &cd_S15016C7);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS15016C7(Test_S15016C7, "S15016C7", ABISELECT(16,12));

#else // __cplusplus

extern Class_Descriptor cd_S6683C5_nt;
static Base_Class bases_S15016C7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S15016C7 = {  "S15016C7", // class name
  bases_S15016C7, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(16,12), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15016C6  : S15016C7 {
};
//SIG(-1 S15016C6) C1{ BC2{ BC3{ m Fp Fi[2]}}}



static void Test_S15016C6()
{
  extern Class_Descriptor cd_S15016C6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(3,4)];
    init_test(&cd_S15016C6, buf);
    S15016C6 &lv = *(new (buf) S15016C6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(S15016C6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15016C6)");
    check_base_class_offset(lv, (S6683C5_nt*)(S15016C7*), 0, "S15016C6");
    check_base_class_offset(lv, (S15016C7*), 0, "S15016C6");
    test_class_info(&lv, &cd_S15016C6);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS15016C6(Test_S15016C6, "S15016C6", ABISELECT(16,12));

#else // __cplusplus

extern Class_Descriptor cd_S6683C5_nt;
extern Class_Descriptor cd_S15016C7;
static Base_Class bases_S15016C6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S6683C5_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S15016C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S15016C6 = {  "S15016C6", // class name
  bases_S15016C6, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(16,12), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15016C1  {
  char s15016c1f0;
  ::S15016C2_nt s15016c1f1;
  ::S15016C6 s15016c1f2;
  ::S15016C6 s15016c1f3;
  void  mf15016c1(); // _ZN8S15016C19mf15016c1Ev
};
//SIG(1 S15016C1) C1{ m Fc FC2{ BC3{ BC4{ BC5{ m Fp Fi[2]}}}} FC6{ BC7{ BC5}} FC6}


void  S15016C1 ::mf15016c1(){}

static void Test_S15016C1()
{
  {
    init_simple_test("S15016C1");
    S15016C1 lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(S15016C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15016C1)");
    check_field_offset(lv, s15016c1f0, 0, "S15016C1.s15016c1f0");
    check_field_offset(lv, s15016c1f1, ABISELECT(8,4), "S15016C1.s15016c1f1");
    check_field_offset(lv, s15016c1f2, ABISELECT(24,16), "S15016C1.s15016c1f2");
    check_field_offset(lv, s15016c1f3, ABISELECT(40,28), "S15016C1.s15016c1f3");
  }
}
static Arrange_To_Call_Me vS15016C1(Test_S15016C1, "S15016C1", ABISELECT(56,40));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16040C1  {
  ::S1142C5_nt s16040c1f0;
  ::S15016C7 s16040c1f1;
  ::S15016C4 s16040c1f2;
  ::S6683C4_nt s16040c1f3;
  void  mf16040c1(); // _ZN8S16040C19mf16040c1Ev
};
//SIG(1 S16040C1) C1{ m FC2{ m Fi[3]} FC3{ BC4{ m Fp Fi[2]}} FC5{ BC4} FC6{ BC4}}


void  S16040C1 ::mf16040c1(){}

static void Test_S16040C1()
{
  {
    init_simple_test("S16040C1");
    S16040C1 lv;
    check2(sizeof(lv), ABISELECT(64,48), "sizeof(S16040C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S16040C1)");
    check_field_offset(lv, s16040c1f0, 0, "S16040C1.s16040c1f0");
    check_field_offset(lv, s16040c1f1, ABISELECT(16,12), "S16040C1.s16040c1f1");
    check_field_offset(lv, s16040c1f2, ABISELECT(32,24), "S16040C1.s16040c1f2");
    check_field_offset(lv, s16040c1f3, ABISELECT(48,36), "S16040C1.s16040c1f3");
  }
}
static Arrange_To_Call_Me vS16040C1(Test_S16040C1, "S16040C1", ABISELECT(64,48));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S20395C2  {
  virtual  ~S20395C2(); // _ZN8S20395C2D1Ev
  virtual void  v8(); // _ZN8S20395C22v8Ev
  virtual void  v9(); // _ZN8S20395C22v9Ev
  S20395C2(); // tgen
};
//SIG(-1 S20395C2) C1{ vd v1 v2}


 S20395C2 ::~S20395C2(){ note_dtor("S20395C2", this);}
void  S20395C2 ::v8(){vfunc_called(this, "_ZN8S20395C22v8Ev");}
void  S20395C2 ::v9(){vfunc_called(this, "_ZN8S20395C22v9Ev");}
S20395C2 ::S20395C2(){ note_ctor("S20395C2", this);} // tgen

static void Test_S20395C2()
{
  extern Class_Descriptor cd_S20395C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S20395C2, buf);
    S20395C2 *dp, &lv = *(dp=new (buf) S20395C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S20395C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S20395C2)");
    test_class_info(&lv, &cd_S20395C2);
    dp->~S20395C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS20395C2(Test_S20395C2, "S20395C2", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S20395C2C1Ev();
extern void _ZN8S20395C2D1Ev();
Name_Map name_map_S20395C2[] = {
  NSPAIR(_ZN8S20395C2C1Ev),
  NSPAIR(_ZN8S20395C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S20395C2[];
extern void _ZN8S20395C2D1Ev();
extern void _ZN8S20395C2D0Ev();
extern void _ZN8S20395C22v8Ev();
extern void _ZN8S20395C22v9Ev();
static  VTBL_ENTRY vtc_S20395C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S20395C2[0]),
  (VTBL_ENTRY)&_ZN8S20395C2D1Ev,
  (VTBL_ENTRY)&_ZN8S20395C2D0Ev,
  (VTBL_ENTRY)&_ZN8S20395C22v8Ev,
  (VTBL_ENTRY)&_ZN8S20395C22v9Ev,
};
extern VTBL_ENTRY _ZTI8S20395C2[];
extern  VTBL_ENTRY _ZTV8S20395C2[];
Class_Descriptor cd_S20395C2 = {  "S20395C2", // class name
  0,0,//no base classes
  &(vtc_S20395C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S20395C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S20395C2),6, //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

struct  S20395C1  : virtual S20395C2 {
  __tsi64 s20395c1f0[2];
  int s20395c1f1;
  void *s20395c1f2;
  virtual  ~S20395C1(); // _ZN8S20395C1D2Ev
  virtual void  v1(); // _ZN8S20395C12v1Ev
  virtual void  v2(); // _ZN8S20395C12v2Ev
  virtual void  v3(); // _ZN8S20395C12v3Ev
  virtual void  v4(); // _ZN8S20395C12v4Ev
  virtual void  v5(); // _ZN8S20395C12v5Ev
  virtual void  v6(); // _ZN8S20395C12v6Ev
  virtual void  v7(); // _ZN8S20395C12v7Ev
  S20395C1(); // tgen
};
//SIG(1 S20395C1) C1{ VBC2{ vd v8 v9} vd v1 v2 v3 v4 v5 v6 v7 FL[2] Fi Fp}


 S20395C1 ::~S20395C1(){ note_dtor("S20395C1", this);}
void  S20395C1 ::v1(){vfunc_called(this, "_ZN8S20395C12v1Ev");}
void  S20395C1 ::v2(){vfunc_called(this, "_ZN8S20395C12v2Ev");}
void  S20395C1 ::v3(){vfunc_called(this, "_ZN8S20395C12v3Ev");}
void  S20395C1 ::v4(){vfunc_called(this, "_ZN8S20395C12v4Ev");}
void  S20395C1 ::v5(){vfunc_called(this, "_ZN8S20395C12v5Ev");}
void  S20395C1 ::v6(){vfunc_called(this, "_ZN8S20395C12v6Ev");}
void  S20395C1 ::v7(){vfunc_called(this, "_ZN8S20395C12v7Ev");}
S20395C1 ::S20395C1(){ note_ctor("S20395C1", this);} // tgen

static void Test_S20395C1()
{
  extern Class_Descriptor cd_S20395C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S20395C1, buf);
    S20395C1 *dp, &lv = *(dp=new (buf) S20395C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S20395C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S20395C1)");
    check_base_class_offset(lv, (S20395C2*), 0, "S20395C1");
    check_field_offset(lv, s20395c1f0, ABISELECT(8,4), "S20395C1.s20395c1f0");
    check_field_offset(lv, s20395c1f1, ABISELECT(24,20), "S20395C1.s20395c1f1");
    check_field_offset(lv, s20395c1f2, ABISELECT(32,24), "S20395C1.s20395c1f2");
    test_class_info(&lv, &cd_S20395C1);
    dp->~S20395C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS20395C1(Test_S20395C1, "S20395C1", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN8S20395C1C1Ev();
extern void _ZN8S20395C1D2Ev();
Name_Map name_map_S20395C1[] = {
  NSPAIR(_ZN8S20395C1C1Ev),
  NSPAIR(_ZN8S20395C1D2Ev),
  {0,0}
};
extern Class_Descriptor cd_S20395C2;
extern VTBL_ENTRY _ZTI8S20395C2[];
extern  VTBL_ENTRY _ZTV8S20395C2[];
static Base_Class bases_S20395C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S20395C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8S20395C1[];
extern void _ZN8S20395C1D1Ev();
extern void _ZN8S20395C1D0Ev();
extern void _ZN8S20395C22v8Ev();
extern void _ZN8S20395C22v9Ev();
extern void _ZN8S20395C12v1Ev();
extern void _ZN8S20395C12v2Ev();
extern void _ZN8S20395C12v3Ev();
extern void _ZN8S20395C12v4Ev();
extern void _ZN8S20395C12v5Ev();
extern void _ZN8S20395C12v6Ev();
extern void _ZN8S20395C12v7Ev();
static  VTBL_ENTRY vtc_S20395C1[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTI8S20395C1[0]),
  (VTBL_ENTRY)&_ZN8S20395C1D1Ev,
  (VTBL_ENTRY)&_ZN8S20395C1D0Ev,
  (VTBL_ENTRY)&_ZN8S20395C22v8Ev,
  (VTBL_ENTRY)&_ZN8S20395C22v9Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v1Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v2Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v3Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v4Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v5Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v6Ev,
  (VTBL_ENTRY)&_ZN8S20395C12v7Ev,
};
extern VTBL_ENTRY _ZTV8S20395C1[];
static  VTT_ENTRY vtt_S20395C1[] = {
  {&(_ZTV8S20395C1[6]),  6,17},
  {&(_ZTV8S20395C1[6]),  6,17},
};
extern VTBL_ENTRY _ZTI8S20395C1[];
extern  VTBL_ENTRY _ZTV8S20395C1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8S20395C1[];
Class_Descriptor cd_S20395C1 = {  "S20395C1", // class name
  bases_S20395C1, 1,
  &(vtc_S20395C1[0]), // expected_vtbl_contents
  &(vtt_S20395C1[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI8S20395C1),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV8S20395C1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8S20395C1),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2518C2  : S2519C3 {
  virtual void  v5(); // _ZN7S2518C22v5Ev
  virtual void  v6(); // _ZN7S2518C22v6Ev
  virtual void  v7(); // _ZN7S2518C22v7Ev
  virtual void  v8(); // _ZN7S2518C22v8Ev
  ~S2518C2(); // tgen
  S2518C2(); // tgen
};
//SIG(-1 S2518C2) C1{ BC2{ m Fi Fc Fl FL Fp} v1 v2 v3 v4}


void  S2518C2 ::v5(){vfunc_called(this, "_ZN7S2518C22v5Ev");}
void  S2518C2 ::v6(){vfunc_called(this, "_ZN7S2518C22v6Ev");}
void  S2518C2 ::v7(){vfunc_called(this, "_ZN7S2518C22v7Ev");}
void  S2518C2 ::v8(){vfunc_called(this, "_ZN7S2518C22v8Ev");}
S2518C2 ::~S2518C2(){ note_dtor("S2518C2", this);} // tgen
S2518C2 ::S2518C2(){ note_ctor("S2518C2", this);} // tgen

static void Test_S2518C2()
{
  extern Class_Descriptor cd_S2518C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2518C2, buf);
    S2518C2 *dp, &lv = *(dp=new (buf) S2518C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2518C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2518C2)");
    check_base_class_offset(lv, (S2519C3*), ABISELECT(8,4), "S2518C2");
    test_class_info(&lv, &cd_S2518C2);
    dp->~S2518C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2518C2(Test_S2518C2, "S2518C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2518C2C1Ev();
extern void _ZN7S2518C2D1Ev();
Name_Map name_map_S2518C2[] = {
  NSPAIR(_ZN7S2518C2C1Ev),
  NSPAIR(_ZN7S2518C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S2518C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2518C2[];
extern void _ZN7S2518C22v5Ev();
extern void _ZN7S2518C22v6Ev();
extern void _ZN7S2518C22v7Ev();
extern void _ZN7S2518C22v8Ev();
static  VTBL_ENTRY vtc_S2518C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2518C2[0]),
  (VTBL_ENTRY)&_ZN7S2518C22v5Ev,
  (VTBL_ENTRY)&_ZN7S2518C22v6Ev,
  (VTBL_ENTRY)&_ZN7S2518C22v7Ev,
  (VTBL_ENTRY)&_ZN7S2518C22v8Ev,
};
extern VTBL_ENTRY _ZTI7S2518C2[];
extern  VTBL_ENTRY _ZTV7S2518C2[];
Class_Descriptor cd_S2518C2 = {  "S2518C2", // class name
  bases_S2518C2, 1,
  &(vtc_S2518C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2518C2),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7S2518C2),6, //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

struct  S2518C1  : S2518C2 {
  virtual void  v1(); // _ZN7S2518C12v1Ev
  virtual void  v2(); // _ZN7S2518C12v2Ev
  virtual void  v3(); // _ZN7S2518C12v3Ev
  virtual void  v4(); // _ZN7S2518C12v4Ev
  ~S2518C1(); // tgen
  S2518C1(); // tgen
};
//SIG(1 S2518C1) C1{ BC2{ BC3{ m Fi Fc Fl FL Fp} v5 v6 v7 v8} v1 v2 v3 v4}


void  S2518C1 ::v1(){vfunc_called(this, "_ZN7S2518C12v1Ev");}
void  S2518C1 ::v2(){vfunc_called(this, "_ZN7S2518C12v2Ev");}
void  S2518C1 ::v3(){vfunc_called(this, "_ZN7S2518C12v3Ev");}
void  S2518C1 ::v4(){vfunc_called(this, "_ZN7S2518C12v4Ev");}
S2518C1 ::~S2518C1(){ note_dtor("S2518C1", this);} // tgen
S2518C1 ::S2518C1(){ note_ctor("S2518C1", this);} // tgen

static void Test_S2518C1()
{
  extern Class_Descriptor cd_S2518C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2518C1, buf);
    S2518C1 *dp, &lv = *(dp=new (buf) S2518C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2518C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2518C1)");
    check_base_class_offset(lv, (S2519C3*)(S2518C2*), ABISELECT(8,4), "S2518C1");
    check_base_class_offset(lv, (S2518C2*), 0, "S2518C1");
    test_class_info(&lv, &cd_S2518C1);
    dp->~S2518C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2518C1(Test_S2518C1, "S2518C1", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2518C1C1Ev();
extern void _ZN7S2518C1D1Ev();
Name_Map name_map_S2518C1[] = {
  NSPAIR(_ZN7S2518C1C1Ev),
  NSPAIR(_ZN7S2518C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
extern Class_Descriptor cd_S2518C2;
extern VTBL_ENTRY _ZTI7S2518C2[];
extern  VTBL_ENTRY _ZTV7S2518C2[];
static Base_Class bases_S2518C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2518C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2518C1[];
extern void _ZN7S2518C22v5Ev();
extern void _ZN7S2518C22v6Ev();
extern void _ZN7S2518C22v7Ev();
extern void _ZN7S2518C22v8Ev();
extern void _ZN7S2518C12v1Ev();
extern void _ZN7S2518C12v2Ev();
extern void _ZN7S2518C12v3Ev();
extern void _ZN7S2518C12v4Ev();
static  VTBL_ENTRY vtc_S2518C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2518C1[0]),
  (VTBL_ENTRY)&_ZN7S2518C22v5Ev,
  (VTBL_ENTRY)&_ZN7S2518C22v6Ev,
  (VTBL_ENTRY)&_ZN7S2518C22v7Ev,
  (VTBL_ENTRY)&_ZN7S2518C22v8Ev,
  (VTBL_ENTRY)&_ZN7S2518C12v1Ev,
  (VTBL_ENTRY)&_ZN7S2518C12v2Ev,
  (VTBL_ENTRY)&_ZN7S2518C12v3Ev,
  (VTBL_ENTRY)&_ZN7S2518C12v4Ev,
};
extern VTBL_ENTRY _ZTI7S2518C1[];
extern  VTBL_ENTRY _ZTV7S2518C1[];
Class_Descriptor cd_S2518C1 = {  "S2518C1", // class name
  bases_S2518C1, 2,
  &(vtc_S2518C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2518C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2518C1),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S9198C2_nt  {
  short s9198c2f0;
  int s9198c2f1;
  char s9198c2f2;
  void *s9198c2f3;
  int s9198c2f4;
  virtual  ~S9198C2_nt(); // _ZN10S9198C2_ntD1Ev
  virtual void  v3(); // _ZN10S9198C2_nt2v3Ev
  virtual void  v4(); // _ZN10S9198C2_nt2v4Ev
  S9198C2_nt(); // tgen
};
//SIG(-1 S9198C2_nt) C1{ vd v1 v2 Fs Fi Fc Fp Fi}


 S9198C2_nt ::~S9198C2_nt(){ note_dtor("S9198C2_nt", this);}
void  S9198C2_nt ::v3(){vfunc_called(this, "_ZN10S9198C2_nt2v3Ev");}
void  S9198C2_nt ::v4(){vfunc_called(this, "_ZN10S9198C2_nt2v4Ev");}
S9198C2_nt ::S9198C2_nt(){ note_ctor("S9198C2_nt", this);} // tgen

//skip512 S9198C2_nt

#else // __cplusplus

extern void _ZN10S9198C2_ntC1Ev();
extern void _ZN10S9198C2_ntD1Ev();
Name_Map name_map_S9198C2_nt[] = {
  NSPAIR(_ZN10S9198C2_ntC1Ev),
  NSPAIR(_ZN10S9198C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI10S9198C2_nt[];
extern void _ZN10S9198C2_ntD1Ev();
extern void _ZN10S9198C2_ntD0Ev();
extern void _ZN10S9198C2_nt2v3Ev();
extern void _ZN10S9198C2_nt2v4Ev();
static  VTBL_ENTRY vtc_S9198C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S9198C2_nt[0]),
  (VTBL_ENTRY)&_ZN10S9198C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S9198C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN10S9198C2_nt2v3Ev,
  (VTBL_ENTRY)&_ZN10S9198C2_nt2v4Ev,
};
extern VTBL_ENTRY _ZTI10S9198C2_nt[];
VTBL_ENTRY *P__ZTI10S9198C2_nt = _ZTI10S9198C2_nt; 
extern  VTBL_ENTRY _ZTV10S9198C2_nt[];
Class_Descriptor cd_S9198C2_nt = {  "S9198C2_nt", // class name
  0,0,//no base classes
  &(vtc_S9198C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI10S9198C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV10S9198C2_nt),6, //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

struct  S9198C1  : S9198C2_nt {
  ::S10103C18 s9198c1f0;
  virtual  ~S9198C1(); // _ZN7S9198C1D1Ev
  virtual void  v1(); // _ZN7S9198C12v1Ev
  virtual void  v2(); // _ZN7S9198C12v2Ev
  S9198C1(); // tgen
};
//SIG(1 S9198C1) C1{ BC2{ vd v3 v4 Fs Fi Fc Fp Fi} vd v1 v2 FC3{ Fi[11]}}


 S9198C1 ::~S9198C1(){ note_dtor("S9198C1", this);}
void  S9198C1 ::v1(){vfunc_called(this, "_ZN7S9198C12v1Ev");}
void  S9198C1 ::v2(){vfunc_called(this, "_ZN7S9198C12v2Ev");}
S9198C1 ::S9198C1(){ note_ctor("S9198C1", this);} // tgen

static void Test_S9198C1()
{
  extern Class_Descriptor cd_S9198C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,18)];
    init_test(&cd_S9198C1, buf);
    S9198C1 *dp, &lv = *(dp=new (buf) S9198C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,68), "sizeof(S9198C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S9198C1)");
    check_base_class_offset(lv, (S9198C2_nt*), 0, "S9198C1");
    check_field_offset(lv, s9198c1f0, ABISELECT(36,24), "S9198C1.s9198c1f0");
    test_class_info(&lv, &cd_S9198C1);
    dp->~S9198C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS9198C1(Test_S9198C1, "S9198C1", ABISELECT(80,68));

#else // __cplusplus

extern void _ZN7S9198C1C1Ev();
extern void _ZN7S9198C1D1Ev();
Name_Map name_map_S9198C1[] = {
  NSPAIR(_ZN7S9198C1C1Ev),
  NSPAIR(_ZN7S9198C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S9198C2_nt;
extern VTBL_ENTRY _ZTI10S9198C2_nt[];
extern  VTBL_ENTRY _ZTV10S9198C2_nt[];
static Base_Class bases_S9198C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S9198C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S9198C1[];
extern void _ZN7S9198C1D1Ev();
extern void _ZN7S9198C1D0Ev();
extern void _ZN10S9198C2_nt2v3Ev();
extern void _ZN10S9198C2_nt2v4Ev();
extern void _ZN7S9198C12v1Ev();
extern void _ZN7S9198C12v2Ev();
static  VTBL_ENTRY vtc_S9198C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S9198C1[0]),
  (VTBL_ENTRY)&_ZN7S9198C1D1Ev,
  (VTBL_ENTRY)&_ZN7S9198C1D0Ev,
  (VTBL_ENTRY)&_ZN10S9198C2_nt2v3Ev,
  (VTBL_ENTRY)&_ZN10S9198C2_nt2v4Ev,
  (VTBL_ENTRY)&_ZN7S9198C12v1Ev,
  (VTBL_ENTRY)&_ZN7S9198C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S9198C1[];
extern  VTBL_ENTRY _ZTV7S9198C1[];
Class_Descriptor cd_S9198C1 = {  "S9198C1", // class name
  bases_S9198C1, 1,
  &(vtc_S9198C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,68), // object size
  NSPAIRA(_ZTI7S9198C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S9198C1),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14374C1  {
  void *s14374c1f0;
  int s14374c1f1[7];
  void *s14374c1f2;
  char s14374c1f3[1280];
  int s14374c1f4[2];
  __tsi64 s14374c1f5;
  int s14374c1f6[2];
  char s14374c1f7[8];
  int s14374c1f8[5];
};
//SIG(1 S14374C1) C1{ Fp Fi[7] Fp Fc[1280] Fi[2] FL Fi[2] Fc[8] Fi[5]}



static void Test_S14374C1()
{
  {
    init_simple_test("S14374C1");
    S14374C1 lv;
    check2(sizeof(lv), ABISELECT(1384,1368), "sizeof(S14374C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14374C1)");
    check_field_offset(lv, s14374c1f0, 0, "S14374C1.s14374c1f0");
    check_field_offset(lv, s14374c1f1, ABISELECT(8,4), "S14374C1.s14374c1f1");
    check_field_offset(lv, s14374c1f2, ABISELECT(40,32), "S14374C1.s14374c1f2");
    check_field_offset(lv, s14374c1f3, ABISELECT(48,36), "S14374C1.s14374c1f3");
    check_field_offset(lv, s14374c1f4, ABISELECT(1328,1316), "S14374C1.s14374c1f4");
    check_field_offset(lv, s14374c1f5, ABISELECT(1336,1324), "S14374C1.s14374c1f5");
    check_field_offset(lv, s14374c1f6, ABISELECT(1344,1332), "S14374C1.s14374c1f6");
    check_field_offset(lv, s14374c1f7, ABISELECT(1352,1340), "S14374C1.s14374c1f7");
    check_field_offset(lv, s14374c1f8, ABISELECT(1360,1348), "S14374C1.s14374c1f8");
  }
}
static Arrange_To_Call_Me vS14374C1(Test_S14374C1, "S14374C1", ABISELECT(1384,1368));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15806C1  {
  ::S10103C82_nt s15806c1f0;
  ::S10103C82_nt s15806c1f1;
  ::S10103C82_nt s15806c1f2;
  ::S10103C105 s15806c1f3;
  int s15806c1f4;
  char s15806c1f5[2];
  void  mf15806c1(); // _ZN8S15806C19mf15806c1Ev
};
//SIG(1 S15806C1) C1{ m FC2{ m FC3{ m FL[2]}} FC2 FC2 FC4{ m Fp} Fi Fc[2]}


void  S15806C1 ::mf15806c1(){}

static void Test_S15806C1()
{
  {
    init_simple_test("S15806C1");
    S15806C1 lv;
    check2(sizeof(lv), ABISELECT(64,60), "sizeof(S15806C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15806C1)");
    check_field_offset(lv, s15806c1f0, 0, "S15806C1.s15806c1f0");
    check_field_offset(lv, s15806c1f1, 16, "S15806C1.s15806c1f1");
    check_field_offset(lv, s15806c1f2, 32, "S15806C1.s15806c1f2");
    check_field_offset(lv, s15806c1f3, 48, "S15806C1.s15806c1f3");
    check_field_offset(lv, s15806c1f4, ABISELECT(56,52), "S15806C1.s15806c1f4");
    check_field_offset(lv, s15806c1f5, ABISELECT(60,56), "S15806C1.s15806c1f5");
  }
}
static Arrange_To_Call_Me vS15806C1(Test_S15806C1, "S15806C1", ABISELECT(64,60));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2919C2_nt  : S10103C88 {
  virtual  ~S2919C2_nt(); // _ZN10S2919C2_ntD1Ev
  virtual void  v3(); // _ZN10S2919C2_nt2v3Ev
  S2919C2_nt(); // tgen
};
//SIG(-1 S2919C2_nt) C1{ BC2{ m} vd v1}


 S2919C2_nt ::~S2919C2_nt(){ note_dtor("S2919C2_nt", this);}
void  S2919C2_nt ::v3(){vfunc_called(this, "_ZN10S2919C2_nt2v3Ev");}
S2919C2_nt ::S2919C2_nt(){ note_ctor("S2919C2_nt", this);} // tgen

//skip512 S2919C2_nt

#else // __cplusplus

extern void _ZN10S2919C2_ntC1Ev();
extern void _ZN10S2919C2_ntD1Ev();
Name_Map name_map_S2919C2_nt[] = {
  NSPAIR(_ZN10S2919C2_ntC1Ev),
  NSPAIR(_ZN10S2919C2_ntD1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C88;
extern VTBL_ENTRY _ZTI9S10103C88[];
static Base_Class bases_S2919C2_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C88,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S2919C2_nt[];
extern void _ZN10S2919C2_ntD1Ev();
extern void _ZN10S2919C2_ntD0Ev();
extern void _ZN10S2919C2_nt2v3Ev();
static  VTBL_ENTRY vtc_S2919C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S2919C2_nt[0]),
  (VTBL_ENTRY)&_ZN10S2919C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S2919C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN10S2919C2_nt2v3Ev,
};
extern VTBL_ENTRY _ZTI10S2919C2_nt[];
VTBL_ENTRY *P__ZTI10S2919C2_nt = _ZTI10S2919C2_nt; 
extern  VTBL_ENTRY _ZTV10S2919C2_nt[];
Class_Descriptor cd_S2919C2_nt = {  "S2919C2_nt", // class name
  bases_S2919C2_nt, 1,
  &(vtc_S2919C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI10S2919C2_nt),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV10S2919C2_nt),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2919C1  : S2919C2_nt {
  int s2919c1f0[2];
  void *s2919c1f1[2];
  int s2919c1f2[6];
  void *s2919c1f3;
  virtual  ~S2919C1(); // _ZN7S2919C1D1Ev
  virtual void  v1(); // _ZN7S2919C12v1Ev
  virtual void  v2(); // _ZN7S2919C12v2Ev
  S2919C1(); // tgen
};
//SIG(1 S2919C1) C1{ BC2{ BC3{ m} vd v3} vd v1 v2 Fi[2] Fp[2] Fi[6] Fp}


 S2919C1 ::~S2919C1(){ note_dtor("S2919C1", this);}
void  S2919C1 ::v1(){vfunc_called(this, "_ZN7S2919C12v1Ev");}
void  S2919C1 ::v2(){vfunc_called(this, "_ZN7S2919C12v2Ev");}
S2919C1 ::S2919C1(){ note_ctor("S2919C1", this);} // tgen

static void Test_S2919C1()
{
  extern Class_Descriptor cd_S2919C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,13)];
    init_test(&cd_S2919C1, buf);
    S2919C1 *dp, &lv = *(dp=new (buf) S2919C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,48), "sizeof(S2919C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2919C1)");
    check_base_class_offset(lv, (S10103C88*)(S2919C2_nt*), 0, "S2919C1");
    check_base_class_offset(lv, (S2919C2_nt*), 0, "S2919C1");
    check_field_offset(lv, s2919c1f0, ABISELECT(8,4), "S2919C1.s2919c1f0");
    check_field_offset(lv, s2919c1f1, ABISELECT(16,12), "S2919C1.s2919c1f1");
    check_field_offset(lv, s2919c1f2, ABISELECT(32,20), "S2919C1.s2919c1f2");
    check_field_offset(lv, s2919c1f3, ABISELECT(56,44), "S2919C1.s2919c1f3");
    test_class_info(&lv, &cd_S2919C1);
    dp->~S2919C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2919C1(Test_S2919C1, "S2919C1", ABISELECT(64,48));

#else // __cplusplus

extern void _ZN7S2919C1C1Ev();
extern void _ZN7S2919C1D1Ev();
Name_Map name_map_S2919C1[] = {
  NSPAIR(_ZN7S2919C1C1Ev),
  NSPAIR(_ZN7S2919C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C88;
extern VTBL_ENTRY _ZTI9S10103C88[];
extern Class_Descriptor cd_S2919C2_nt;
extern VTBL_ENTRY _ZTI10S2919C2_nt[];
extern  VTBL_ENTRY _ZTV10S2919C2_nt[];
static Base_Class bases_S2919C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C88,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2919C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2919C1[];
extern void _ZN7S2919C1D1Ev();
extern void _ZN7S2919C1D0Ev();
extern void _ZN10S2919C2_nt2v3Ev();
extern void _ZN7S2919C12v1Ev();
extern void _ZN7S2919C12v2Ev();
static  VTBL_ENTRY vtc_S2919C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2919C1[0]),
  (VTBL_ENTRY)&_ZN7S2919C1D1Ev,
  (VTBL_ENTRY)&_ZN7S2919C1D0Ev,
  (VTBL_ENTRY)&_ZN10S2919C2_nt2v3Ev,
  (VTBL_ENTRY)&_ZN7S2919C12v1Ev,
  (VTBL_ENTRY)&_ZN7S2919C12v2Ev,
};
extern VTBL_ENTRY _ZTI7S2919C1[];
extern  VTBL_ENTRY _ZTV7S2919C1[];
Class_Descriptor cd_S2919C1 = {  "S2919C1", // class name
  bases_S2919C1, 2,
  &(vtc_S2919C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,48), // object size
  NSPAIRA(_ZTI7S2919C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2919C1),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8012C1  : S15477C3 {
  void *s8012c1f0;
  virtual  ~S8012C1(); // _ZN7S8012C1D1Ev
  S8012C1(); // tgen
};
//SIG(1 S8012C1) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m}} Fi Fp[4] Fi} vd Fp}


 S8012C1 ::~S8012C1(){ note_dtor("S8012C1", this);}
S8012C1 ::S8012C1(){ note_ctor("S8012C1", this);} // tgen

static void Test_S8012C1()
{
  extern Class_Descriptor cd_S8012C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,12)];
    init_test(&cd_S8012C1, buf);
    S8012C1 *dp, &lv = *(dp=new (buf) S8012C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,44), "sizeof(S8012C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8012C1)");
    check_base_class_offset(lv, (S15477C3*), 0, "S8012C1");
    check_field_offset(lv, s8012c1f0, ABISELECT(72,40), "S8012C1.s8012c1f0");
    test_class_info(&lv, &cd_S8012C1);
    dp->~S8012C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8012C1(Test_S8012C1, "S8012C1", ABISELECT(80,44));

#else // __cplusplus

extern void _ZN7S8012C1C1Ev();
extern void _ZN7S8012C1D1Ev();
Name_Map name_map_S8012C1[] = {
  NSPAIR(_ZN7S8012C1C1Ev),
  NSPAIR(_ZN7S8012C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S15477C3;
extern VTBL_ENTRY _ZTI8S15477C3[];
extern  VTBL_ENTRY _ZTV8S15477C3[];
static Base_Class bases_S8012C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S15477C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8012C1[];
extern void _ZN7S8012C1D1Ev();
extern void _ZN7S8012C1D0Ev();
static  VTBL_ENTRY vtc_S8012C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8012C1[0]),
  (VTBL_ENTRY)&_ZN7S8012C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8012C1D0Ev,
};
extern VTBL_ENTRY _ZTI7S8012C1[];
extern  VTBL_ENTRY _ZTV7S8012C1[];
Class_Descriptor cd_S8012C1 = {  "S8012C1", // class name
  bases_S8012C1, 1,
  &(vtc_S8012C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(80,44), // object size
  NSPAIRA(_ZTI7S8012C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8012C1),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S20068C2_nt  {
  virtual void  v2(); // _ZN11S20068C2_nt2v2Ev
  virtual void  v3(); // _ZN11S20068C2_nt2v3Ev
  virtual void  v4(); // _ZN11S20068C2_nt2v4Ev
  virtual void  v5(); // _ZN11S20068C2_nt2v5Ev
  virtual void  v6(); // _ZN11S20068C2_nt2v6Ev
  virtual void  v7(); // _ZN11S20068C2_nt2v7Ev
  ~S20068C2_nt(); // tgen
  S20068C2_nt(); // tgen
};
//SIG(-1 S20068C2_nt) C1{ v1 v2 v3 v4 v5 v6}


void  S20068C2_nt ::v2(){vfunc_called(this, "_ZN11S20068C2_nt2v2Ev");}
void  S20068C2_nt ::v3(){vfunc_called(this, "_ZN11S20068C2_nt2v3Ev");}
void  S20068C2_nt ::v4(){vfunc_called(this, "_ZN11S20068C2_nt2v4Ev");}
void  S20068C2_nt ::v5(){vfunc_called(this, "_ZN11S20068C2_nt2v5Ev");}
void  S20068C2_nt ::v6(){vfunc_called(this, "_ZN11S20068C2_nt2v6Ev");}
void  S20068C2_nt ::v7(){vfunc_called(this, "_ZN11S20068C2_nt2v7Ev");}
S20068C2_nt ::~S20068C2_nt(){ note_dtor("S20068C2_nt", this);} // tgen
S20068C2_nt ::S20068C2_nt(){ note_ctor("S20068C2_nt", this);} // tgen

//skip512 S20068C2_nt

#else // __cplusplus

extern void _ZN11S20068C2_ntC1Ev();
extern void _ZN11S20068C2_ntD1Ev();
Name_Map name_map_S20068C2_nt[] = {
  NSPAIR(_ZN11S20068C2_ntC1Ev),
  NSPAIR(_ZN11S20068C2_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S20068C2_nt[];
extern void _ZN11S20068C2_nt2v2Ev();
extern void _ZN11S20068C2_nt2v3Ev();
extern void _ZN11S20068C2_nt2v4Ev();
extern void _ZN11S20068C2_nt2v5Ev();
extern void _ZN11S20068C2_nt2v6Ev();
extern void _ZN11S20068C2_nt2v7Ev();
static  VTBL_ENTRY vtc_S20068C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S20068C2_nt[0]),
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v2Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v3Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v4Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v5Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v7Ev,
};
extern VTBL_ENTRY _ZTI11S20068C2_nt[];
VTBL_ENTRY *P__ZTI11S20068C2_nt = _ZTI11S20068C2_nt; 
extern  VTBL_ENTRY _ZTV11S20068C2_nt[];
Class_Descriptor cd_S20068C2_nt = {  "S20068C2_nt", // class name
  0,0,//no base classes
  &(vtc_S20068C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI11S20068C2_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV11S20068C2_nt),8, //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

struct  S20068C3_nt  {
  int s20068c3f0;
  virtual  ~S20068C3_nt(); // _ZN11S20068C3_ntD1Ev
  virtual void  v8(); // _ZN11S20068C3_nt2v8Ev
  S20068C3_nt(); // tgen
};
//SIG(-1 S20068C3_nt) C1{ vd v1 Fi}


 S20068C3_nt ::~S20068C3_nt(){ note_dtor("S20068C3_nt", this);}
void  S20068C3_nt ::v8(){vfunc_called(this, "_ZN11S20068C3_nt2v8Ev");}
S20068C3_nt ::S20068C3_nt(){ note_ctor("S20068C3_nt", this);} // tgen

//skip512 S20068C3_nt

#else // __cplusplus

extern void _ZN11S20068C3_ntC1Ev();
extern void _ZN11S20068C3_ntD1Ev();
Name_Map name_map_S20068C3_nt[] = {
  NSPAIR(_ZN11S20068C3_ntC1Ev),
  NSPAIR(_ZN11S20068C3_ntD1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI11S20068C3_nt[];
extern void _ZN11S20068C3_ntD1Ev();
extern void _ZN11S20068C3_ntD0Ev();
extern void _ZN11S20068C3_nt2v8Ev();
static  VTBL_ENTRY vtc_S20068C3_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI11S20068C3_nt[0]),
  (VTBL_ENTRY)&_ZN11S20068C3_ntD1Ev,
  (VTBL_ENTRY)&_ZN11S20068C3_ntD0Ev,
  (VTBL_ENTRY)&_ZN11S20068C3_nt2v8Ev,
};
extern VTBL_ENTRY _ZTI11S20068C3_nt[];
VTBL_ENTRY *P__ZTI11S20068C3_nt = _ZTI11S20068C3_nt; 
extern  VTBL_ENTRY _ZTV11S20068C3_nt[];
Class_Descriptor cd_S20068C3_nt = {  "S20068C3_nt", // class name
  0,0,//no base classes
  &(vtc_S20068C3_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI11S20068C3_nt),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV11S20068C3_nt),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S20068C1  : virtual S20068C2_nt , S20068C3_nt {
  long double s20068c1f0;
  virtual  ~S20068C1(); // _ZN8S20068C1D2Ev
  virtual void  v1(); // _ZN8S20068C12v1Ev
  S20068C1(); // tgen
};
//SIG(1 S20068C1) C1{ VBC2{ v2 v3 v4 v5 v6 v7} BC3{ vd v8 Fi} vd v1 FD}


 S20068C1 ::~S20068C1(){ note_dtor("S20068C1", this);}
void  S20068C1 ::v1(){vfunc_called(this, "_ZN8S20068C12v1Ev");}
S20068C1 ::S20068C1(){ note_ctor("S20068C1", this);} // tgen

static void Test_S20068C1()
{
  extern Class_Descriptor cd_S20068C1;
  void *lvp;
  {
    ABISELECT(sal_16,int) buf[ABISELECT(4,7)];
    init_test(&cd_S20068C1, buf);
    S20068C1 *dp, &lv = *(dp=new (buf) S20068C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(S20068C1)");
    check2(__alignof__(lv), ABISELECT(16,4), "__alignof__(S20068C1)");
    check_base_class_offset(lv, (S20068C2_nt*), ABISELECT(32,20), "S20068C1");
    check_base_class_offset(lv, (S20068C3_nt*), 0, "S20068C1");
    check_field_offset(lv, s20068c1f0, ABISELECT(16,8), "S20068C1.s20068c1f0");
    test_class_info(&lv, &cd_S20068C1);
    dp->~S20068C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS20068C1(Test_S20068C1, "S20068C1", ABISELECT(48,24));

#else // __cplusplus

extern void _ZN8S20068C1C1Ev();
extern void _ZN8S20068C1D2Ev();
Name_Map name_map_S20068C1[] = {
  NSPAIR(_ZN8S20068C1C1Ev),
  NSPAIR(_ZN8S20068C1D2Ev),
  {0,0}
};
extern Class_Descriptor cd_S20068C2_nt;
extern VTBL_ENTRY _ZTI11S20068C2_nt[];
extern  VTBL_ENTRY _ZTV11S20068C2_nt[];
extern Class_Descriptor cd_S20068C3_nt;
extern VTBL_ENTRY _ZTI11S20068C3_nt[];
extern  VTBL_ENTRY _ZTV11S20068C3_nt[];
static Base_Class bases_S20068C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S20068C2_nt,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    8, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_S20068C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8S20068C1[];
extern void _ZN8S20068C1D1Ev();
extern void _ZN8S20068C1D0Ev();
extern void _ZN11S20068C3_nt2v8Ev();
extern void _ZN8S20068C12v1Ev();
extern void _ZN11S20068C2_nt2v2Ev();
extern void _ZN11S20068C2_nt2v3Ev();
extern void _ZN11S20068C2_nt2v4Ev();
extern void _ZN11S20068C2_nt2v5Ev();
extern void _ZN11S20068C2_nt2v6Ev();
extern void _ZN11S20068C2_nt2v7Ev();
static  VTBL_ENTRY vtc_S20068C1[] = {
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8S20068C1[0]),
  (VTBL_ENTRY)&_ZN8S20068C1D1Ev,
  (VTBL_ENTRY)&_ZN8S20068C1D0Ev,
  (VTBL_ENTRY)&_ZN11S20068C3_nt2v8Ev,
  (VTBL_ENTRY)&_ZN8S20068C12v1Ev,
  0,
  0,
  0,
  0,
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8S20068C1[0]),
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v2Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v3Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v4Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v5Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v6Ev,
  (VTBL_ENTRY)&_ZN11S20068C2_nt2v7Ev,
};
extern VTBL_ENTRY _ZTV8S20068C1[];
static  VTT_ENTRY vtt_S20068C1[] = {
  {&(_ZTV8S20068C1[3]),  3,21},
  {&(_ZTV8S20068C1[15]),  15,21},
};
extern VTBL_ENTRY _ZTI8S20068C1[];
extern  VTBL_ENTRY _ZTV8S20068C1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8S20068C1[];
Class_Descriptor cd_S20068C1 = {  "S20068C1", // class name
  bases_S20068C1, 2,
  &(vtc_S20068C1[0]), // expected_vtbl_contents
  &(vtt_S20068C1[0]), // expected_vtt_contents
  ABISELECT(48,24), // object size
  NSPAIRA(_ZTI8S20068C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8S20068C1),21, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8S20068C1),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8697C2  {
  int s8697c2f0;
  char s8697c2f1[2050];
  virtual  ~S8697C2(); // _ZN7S8697C2D1Ev
  virtual void  v2(); // _ZN7S8697C22v2Ev
  S8697C2(); // tgen
};
//SIG(-1 S8697C2) C1{ vd v1 Fi Fc[2050]}


 S8697C2 ::~S8697C2(){ note_dtor("S8697C2", this);}
void  S8697C2 ::v2(){vfunc_called(this, "_ZN7S8697C22v2Ev");}
S8697C2 ::S8697C2(){ note_ctor("S8697C2", this);} // tgen

static void Test_S8697C2()
{
  extern Class_Descriptor cd_S8697C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(259,516)];
    init_test(&cd_S8697C2, buf);
    S8697C2 *dp, &lv = *(dp=new (buf) S8697C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2064,2060), "sizeof(S8697C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8697C2)");
    check_field_offset(lv, s8697c2f0, ABISELECT(8,4), "S8697C2.s8697c2f0");
    check_field_offset(lv, s8697c2f1, ABISELECT(12,8), "S8697C2.s8697c2f1");
    test_class_info(&lv, &cd_S8697C2);
    dp->~S8697C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8697C2(Test_S8697C2, "S8697C2", ABISELECT(2064,2060));

#else // __cplusplus

extern void _ZN7S8697C2C1Ev();
extern void _ZN7S8697C2D1Ev();
Name_Map name_map_S8697C2[] = {
  NSPAIR(_ZN7S8697C2C1Ev),
  NSPAIR(_ZN7S8697C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S8697C2[];
extern void _ZN7S8697C2D1Ev();
extern void _ZN7S8697C2D0Ev();
extern void _ZN7S8697C22v2Ev();
static  VTBL_ENTRY vtc_S8697C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8697C2[0]),
  (VTBL_ENTRY)&_ZN7S8697C2D1Ev,
  (VTBL_ENTRY)&_ZN7S8697C2D0Ev,
  (VTBL_ENTRY)&_ZN7S8697C22v2Ev,
};
extern VTBL_ENTRY _ZTI7S8697C2[];
extern  VTBL_ENTRY _ZTV7S8697C2[];
Class_Descriptor cd_S8697C2 = {  "S8697C2", // class name
  0,0,//no base classes
  &(vtc_S8697C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2064,2060), // object size
  NSPAIRA(_ZTI7S8697C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S8697C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8697C1  : S8697C2 {
  int s8697c1f0;
  void *s8697c1f1[3];
  char s8697c1f2[33];
  virtual  ~S8697C1(); // _ZN7S8697C1D1Ev
  virtual void  v1(); // _ZN7S8697C12v1Ev
  S8697C1(); // tgen
};
//SIG(1 S8697C1) C1{ BC2{ vd v2 Fi Fc[2050]} vd v1 Fi Fp[3] Fc[33]}


 S8697C1 ::~S8697C1(){ note_dtor("S8697C1", this);}
void  S8697C1 ::v1(){vfunc_called(this, "_ZN7S8697C12v1Ev");}
S8697C1 ::S8697C1(){ note_ctor("S8697C1", this);} // tgen

static void Test_S8697C1()
{
  extern Class_Descriptor cd_S8697C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(268,529)];
    init_test(&cd_S8697C1, buf);
    S8697C1 *dp, &lv = *(dp=new (buf) S8697C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2136,2112), "sizeof(S8697C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8697C1)");
    check_base_class_offset(lv, (S8697C2*), 0, "S8697C1");
    check_field_offset(lv, s8697c1f0, ABISELECT(2064,2060), "S8697C1.s8697c1f0");
    check_field_offset(lv, s8697c1f1, ABISELECT(2072,2064), "S8697C1.s8697c1f1");
    check_field_offset(lv, s8697c1f2, ABISELECT(2096,2076), "S8697C1.s8697c1f2");
    test_class_info(&lv, &cd_S8697C1);
    dp->~S8697C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8697C1(Test_S8697C1, "S8697C1", ABISELECT(2136,2112));

#else // __cplusplus

extern void _ZN7S8697C1C1Ev();
extern void _ZN7S8697C1D1Ev();
Name_Map name_map_S8697C1[] = {
  NSPAIR(_ZN7S8697C1C1Ev),
  NSPAIR(_ZN7S8697C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S8697C2;
extern VTBL_ENTRY _ZTI7S8697C2[];
extern  VTBL_ENTRY _ZTV7S8697C2[];
static Base_Class bases_S8697C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S8697C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8697C1[];
extern void _ZN7S8697C1D1Ev();
extern void _ZN7S8697C1D0Ev();
extern void _ZN7S8697C22v2Ev();
extern void _ZN7S8697C12v1Ev();
static  VTBL_ENTRY vtc_S8697C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8697C1[0]),
  (VTBL_ENTRY)&_ZN7S8697C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8697C1D0Ev,
  (VTBL_ENTRY)&_ZN7S8697C22v2Ev,
  (VTBL_ENTRY)&_ZN7S8697C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S8697C1[];
extern  VTBL_ENTRY _ZTV7S8697C1[];
Class_Descriptor cd_S8697C1 = {  "S8697C1", // class name
  bases_S8697C1, 1,
  &(vtc_S8697C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2136,2112), // object size
  NSPAIRA(_ZTI7S8697C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8697C1),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12581C1  {
  int s12581c1f0;
  ::S10103C14_nt s12581c1f1;
  ::S10103C14_nt s12581c1f2;
  ::S10103C14_nt s12581c1f3;
  ::S10103C111_nt s12581c1f4;
};
//SIG(1 S12581C1) C1{ Fi FC2{ m Fp Fi FC3{ m}} FC2 FC2 FC4{ m Fp[2]}}



static void Test_S12581C1()
{
  {
    init_simple_test("S12581C1");
    S12581C1 lv;
    check2(sizeof(lv), ABISELECT(72,48), "sizeof(S12581C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S12581C1)");
    check_field_offset(lv, s12581c1f0, 0, "S12581C1.s12581c1f0");
    check_field_offset(lv, s12581c1f1, ABISELECT(8,4), "S12581C1.s12581c1f1");
    check_field_offset(lv, s12581c1f2, ABISELECT(24,16), "S12581C1.s12581c1f2");
    check_field_offset(lv, s12581c1f3, ABISELECT(40,28), "S12581C1.s12581c1f3");
    check_field_offset(lv, s12581c1f4, ABISELECT(56,40), "S12581C1.s12581c1f4");
  }
}
static Arrange_To_Call_Me vS12581C1(Test_S12581C1, "S12581C1", ABISELECT(72,48));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10670C1  {
  char s10670c1f0[2];
  long s10670c1f1;
  int s10670c1f2[2];
  long s10670c1f3;
  ::S10459C2_nt s10670c1f4;
  char s10670c1f5[158];
};
//SIG(1 S10670C1) C1{ Fc[2] Fl Fi[2] Fl FC2{ Fi[4] Fc[49]} Fc[158]}



static void Test_S10670C1()
{
  {
    init_simple_test("S10670C1");
    S10670C1 lv;
    check2(sizeof(lv), ABISELECT(264,248), "sizeof(S10670C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10670C1)");
    check_field_offset(lv, s10670c1f0, 0, "S10670C1.s10670c1f0");
    check_field_offset(lv, s10670c1f1, ABISELECT(8,4), "S10670C1.s10670c1f1");
    check_field_offset(lv, s10670c1f2, ABISELECT(16,8), "S10670C1.s10670c1f2");
    check_field_offset(lv, s10670c1f3, ABISELECT(24,16), "S10670C1.s10670c1f3");
    check_field_offset(lv, s10670c1f4, ABISELECT(32,20), "S10670C1.s10670c1f4");
    check_field_offset(lv, s10670c1f5, ABISELECT(100,88), "S10670C1.s10670c1f5");
  }
}
static Arrange_To_Call_Me vS10670C1(Test_S10670C1, "S10670C1", ABISELECT(264,248));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2520C2  : S5742C2 {
  void *s2520c2f0;
};
//SIG(-1 S2520C2) C1{ BC2{ m Fi FC3{ m Fi[2] Fp}} Fp}



static void Test_S2520C2()
{
  extern Class_Descriptor cd_S2520C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_S2520C2, buf);
    S2520C2 &lv = *(new (buf) S2520C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(S2520C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2520C2)");
    check_base_class_offset(lv, (S5742C2*), 0, "S2520C2");
    check_field_offset(lv, s2520c2f0, ABISELECT(24,16), "S2520C2.s2520c2f0");
    test_class_info(&lv, &cd_S2520C2);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2520C2(Test_S2520C2, "S2520C2", ABISELECT(32,20));

#else // __cplusplus

extern Class_Descriptor cd_S5742C2;
static Base_Class bases_S2520C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S5742C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2520C2 = {  "S2520C2", // class name
  bases_S2520C2, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(32,20), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2520C1  : S2520C2 {
  char s2520c1f0[65];
  void *s2520c1f1;
};
//SIG(1 S2520C1) C1{ BC2{ BC3{ m Fi FC4{ m Fi[2] Fp}} Fp} Fc[65] Fp}



static void Test_S2520C1()
{
  extern Class_Descriptor cd_S2520C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(15,24)];
    init_test(&cd_S2520C1, buf);
    S2520C1 &lv = *(new (buf) S2520C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(112,92), "sizeof(S2520C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2520C1)");
    check_base_class_offset(lv, (S5742C2*)(S2520C2*), 0, "S2520C1");
    check_base_class_offset(lv, (S2520C2*), 0, "S2520C1");
    check_field_offset(lv, s2520c1f0, ABISELECT(32,20), "S2520C1.s2520c1f0");
    check_field_offset(lv, s2520c1f1, ABISELECT(104,88), "S2520C1.s2520c1f1");
    test_class_info(&lv, &cd_S2520C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2520C1(Test_S2520C1, "S2520C1", ABISELECT(112,92));

#else // __cplusplus

extern Class_Descriptor cd_S5742C2;
extern Class_Descriptor cd_S2520C2;
static Base_Class bases_S2520C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S5742C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2520C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2520C1 = {  "S2520C1", // class name
  bases_S2520C1, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(112,92), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10442C1  {
  char s10442c1f0;
  ::S10459C2_nt s10442c1f1;
  ::S10459C4 s10442c1f2;
};
//SIG(1 S10442C1) C1{ Fc FC2{ Fi[4] Fc[49]} FC3{ Fi[2] Fl Fc[255]}}



static void Test_S10442C1()
{
  {
    init_simple_test("S10442C1");
    S10442C1 lv;
    check2(sizeof(lv), ABISELECT(344,340), "sizeof(S10442C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10442C1)");
    check_field_offset(lv, s10442c1f0, 0, "S10442C1.s10442c1f0");
    check_field_offset(lv, s10442c1f1, 4, "S10442C1.s10442c1f1");
    check_field_offset(lv, s10442c1f2, 72, "S10442C1.s10442c1f2");
  }
}
static Arrange_To_Call_Me vS10442C1(Test_S10442C1, "S10442C1", ABISELECT(344,340));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8013C1  : S15477C3 {
  ~S8013C1(); // tgen
  S8013C1(); // tgen
};
//SIG(1 S8013C1) C1{ BC2{ vd m FC3{ m Fp Fi FC4{ m}} Fi Fp[4] Fi}}


S8013C1 ::~S8013C1(){ note_dtor("S8013C1", this);} // tgen
S8013C1 ::S8013C1(){ note_ctor("S8013C1", this);} // tgen

static void Test_S8013C1()
{
  extern Class_Descriptor cd_S8013C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,11)];
    init_test(&cd_S8013C1, buf);
    S8013C1 *dp, &lv = *(dp=new (buf) S8013C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,40), "sizeof(S8013C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8013C1)");
    check_base_class_offset(lv, (S15477C3*), 0, "S8013C1");
    test_class_info(&lv, &cd_S8013C1);
    dp->~S8013C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8013C1(Test_S8013C1, "S8013C1", ABISELECT(72,40));

#else // __cplusplus

extern void _ZN7S8013C1C1Ev();
extern void _ZN7S8013C1D1Ev();
Name_Map name_map_S8013C1[] = {
  NSPAIR(_ZN7S8013C1C1Ev),
  NSPAIR(_ZN7S8013C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S15477C3;
extern VTBL_ENTRY _ZTI8S15477C3[];
extern  VTBL_ENTRY _ZTV8S15477C3[];
static Base_Class bases_S8013C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S15477C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8013C1[];
extern void _ZN7S8013C1D1Ev();
extern void _ZN7S8013C1D0Ev();
static  VTBL_ENTRY vtc_S8013C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8013C1[0]),
  (VTBL_ENTRY)&_ZN7S8013C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8013C1D0Ev,
};
extern VTBL_ENTRY _ZTI7S8013C1[];
extern  VTBL_ENTRY _ZTV7S8013C1[];
Class_Descriptor cd_S8013C1 = {  "S8013C1", // class name
  bases_S8013C1, 1,
  &(vtc_S8013C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,40), // object size
  NSPAIRA(_ZTI7S8013C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8013C1),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13002C1  {
  int s13002c1f0[2];
  char s13002c1f1[2];
  ::S10103C23_nt s13002c1f2;
  int s13002c1f3[3];
  ::S10103C18 s13002c1f4;
};
//SIG(1 S13002C1) C1{ Fi[2] Fc[2] FC2{ FL[4]} Fi[3] FC3{ Fi[11]}}



static void Test_S13002C1()
{
  {
    init_simple_test("S13002C1");
    S13002C1 lv;
    check2(sizeof(lv), ABISELECT(104,100), "sizeof(S13002C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13002C1)");
    check_field_offset(lv, s13002c1f0, 0, "S13002C1.s13002c1f0");
    check_field_offset(lv, s13002c1f1, 8, "S13002C1.s13002c1f1");
    check_field_offset(lv, s13002c1f2, ABISELECT(16,12), "S13002C1.s13002c1f2");
    check_field_offset(lv, s13002c1f3, ABISELECT(48,44), "S13002C1.s13002c1f3");
    check_field_offset(lv, s13002c1f4, ABISELECT(60,56), "S13002C1.s13002c1f4");
  }
}
static Arrange_To_Call_Me vS13002C1(Test_S13002C1, "S13002C1", ABISELECT(104,100));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13001C1  {
  int s13001c1f0[2];
  char s13001c1f1[2];
  ::S10102C23_nt s13001c1f2;
  int s13001c1f3[3];
  ::S10103C18 s13001c1f4;
};
//SIG(1 S13001C1) C1{ Fi[2] Fc[2] FC2{ Fl[4]} Fi[3] FC3{ Fi[11]}}



static void Test_S13001C1()
{
  {
    init_simple_test("S13001C1");
    S13001C1 lv;
    check2(sizeof(lv), ABISELECT(104,84), "sizeof(S13001C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13001C1)");
    check_field_offset(lv, s13001c1f0, 0, "S13001C1.s13001c1f0");
    check_field_offset(lv, s13001c1f1, 8, "S13001C1.s13001c1f1");
    check_field_offset(lv, s13001c1f2, ABISELECT(16,12), "S13001C1.s13001c1f2");
    check_field_offset(lv, s13001c1f3, ABISELECT(48,28), "S13001C1.s13001c1f3");
    check_field_offset(lv, s13001c1f4, ABISELECT(60,40), "S13001C1.s13001c1f4");
  }
}
static Arrange_To_Call_Me vS13001C1(Test_S13001C1, "S13001C1", ABISELECT(104,84));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13408C1  {
  int s13408c1f0[3];
  short s13408c1f1;
  int s13408c1f2[2];
  short s13408c1f3[2];
  int s13408c1f4;
  short s13408c1f5[355];
  int s13408c1f6[2];
};
//SIG(1 S13408C1) C1{ Fi[3] Fs Fi[2] Fs[2] Fi Fs[355] Fi[2]}



static void Test_S13408C1()
{
  {
    init_simple_test("S13408C1");
    S13408C1 lv;
    check2(sizeof(lv), 752, "sizeof(S13408C1)");
    check2(__alignof__(lv), 4, "__alignof__(S13408C1)");
    check_field_offset(lv, s13408c1f0, 0, "S13408C1.s13408c1f0");
    check_field_offset(lv, s13408c1f1, 12, "S13408C1.s13408c1f1");
    check_field_offset(lv, s13408c1f2, 16, "S13408C1.s13408c1f2");
    check_field_offset(lv, s13408c1f3, 24, "S13408C1.s13408c1f3");
    check_field_offset(lv, s13408c1f4, 28, "S13408C1.s13408c1f4");
    check_field_offset(lv, s13408c1f5, 32, "S13408C1.s13408c1f5");
    check_field_offset(lv, s13408c1f6, 744, "S13408C1.s13408c1f6");
  }
}
static Arrange_To_Call_Me vS13408C1(Test_S13408C1, "S13408C1", 752);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2521C2  : S5742C2 {
  void *s2521c2f0;
};
//SIG(-1 S2521C2) C1{ BC2{ m Fi FC3{ m Fi[2] Fp}} Fp}



static void Test_S2521C2()
{
  extern Class_Descriptor cd_S2521C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_S2521C2, buf);
    S2521C2 &lv = *(new (buf) S2521C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(S2521C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2521C2)");
    check_base_class_offset(lv, (S5742C2*), 0, "S2521C2");
    check_field_offset(lv, s2521c2f0, ABISELECT(24,16), "S2521C2.s2521c2f0");
    test_class_info(&lv, &cd_S2521C2);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2521C2(Test_S2521C2, "S2521C2", ABISELECT(32,20));

#else // __cplusplus

extern Class_Descriptor cd_S5742C2;
static Base_Class bases_S2521C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S5742C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2521C2 = {  "S2521C2", // class name
  bases_S2521C2, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(32,20), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2521C1  : S2521C2 {
  int s2521c1f0[4];
};
//SIG(1 S2521C1) C1{ BC2{ BC3{ m Fi FC4{ m Fi[2] Fp}} Fp} Fi[4]}



static void Test_S2521C1()
{
  extern Class_Descriptor cd_S2521C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_S2521C1, buf);
    S2521C1 &lv = *(new (buf) S2521C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(S2521C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2521C1)");
    check_base_class_offset(lv, (S5742C2*)(S2521C2*), 0, "S2521C1");
    check_base_class_offset(lv, (S2521C2*), 0, "S2521C1");
    check_field_offset(lv, s2521c1f0, ABISELECT(32,20), "S2521C1.s2521c1f0");
    test_class_info(&lv, &cd_S2521C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2521C1(Test_S2521C1, "S2521C1", ABISELECT(48,36));

#else // __cplusplus

extern Class_Descriptor cd_S5742C2;
extern Class_Descriptor cd_S2521C2;
static Base_Class bases_S2521C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S5742C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2521C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S2521C1 = {  "S2521C1", // class name
  bases_S2521C1, 2,
  0, // no vftv
  0, //no vtt
  ABISELECT(48,36), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2516C2  : S2519C3 {
  virtual void  v1(); // _ZN7S2516C22v1Ev
  virtual void  v2(); // _ZN7S2516C22v2Ev
  virtual void  v3(); // _ZN7S2516C22v3Ev
  virtual void  v4(); // _ZN7S2516C22v4Ev
  ~S2516C2(); // tgen
  S2516C2(); // tgen
};
//SIG(-1 S2516C2) C1{ BC2{ m Fi Fc Fl FL Fp} v1 v2 v3 v4}


void  S2516C2 ::v1(){vfunc_called(this, "_ZN7S2516C22v1Ev");}
void  S2516C2 ::v2(){vfunc_called(this, "_ZN7S2516C22v2Ev");}
void  S2516C2 ::v3(){vfunc_called(this, "_ZN7S2516C22v3Ev");}
void  S2516C2 ::v4(){vfunc_called(this, "_ZN7S2516C22v4Ev");}
S2516C2 ::~S2516C2(){ note_dtor("S2516C2", this);} // tgen
S2516C2 ::S2516C2(){ note_ctor("S2516C2", this);} // tgen

static void Test_S2516C2()
{
  extern Class_Descriptor cd_S2516C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2516C2, buf);
    S2516C2 *dp, &lv = *(dp=new (buf) S2516C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2516C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2516C2)");
    check_base_class_offset(lv, (S2519C3*), ABISELECT(8,4), "S2516C2");
    test_class_info(&lv, &cd_S2516C2);
    dp->~S2516C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2516C2(Test_S2516C2, "S2516C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2516C2C1Ev();
extern void _ZN7S2516C2D1Ev();
Name_Map name_map_S2516C2[] = {
  NSPAIR(_ZN7S2516C2C1Ev),
  NSPAIR(_ZN7S2516C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S2516C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2516C2[];
extern void _ZN7S2516C22v1Ev();
extern void _ZN7S2516C22v2Ev();
extern void _ZN7S2516C22v3Ev();
extern void _ZN7S2516C22v4Ev();
static  VTBL_ENTRY vtc_S2516C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2516C2[0]),
  (VTBL_ENTRY)&_ZN7S2516C22v1Ev,
  (VTBL_ENTRY)&_ZN7S2516C22v2Ev,
  (VTBL_ENTRY)&_ZN7S2516C22v3Ev,
  (VTBL_ENTRY)&_ZN7S2516C22v4Ev,
};
extern VTBL_ENTRY _ZTI7S2516C2[];
extern  VTBL_ENTRY _ZTV7S2516C2[];
Class_Descriptor cd_S2516C2 = {  "S2516C2", // class name
  bases_S2516C2, 1,
  &(vtc_S2516C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2516C2),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7S2516C2),6, //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

struct  S2516C1  : S2516C2 {
  ~S2516C1(); // tgen
  S2516C1(); // tgen
};
//SIG(1 S2516C1) C1{ BC2{ BC3{ m Fi Fc Fl FL Fp} v1 v2 v3 v4}}


S2516C1 ::~S2516C1(){ note_dtor("S2516C1", this);} // tgen
S2516C1 ::S2516C1(){ note_ctor("S2516C1", this);} // tgen

static void Test_S2516C1()
{
  extern Class_Descriptor cd_S2516C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2516C1, buf);
    S2516C1 *dp, &lv = *(dp=new (buf) S2516C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2516C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2516C1)");
    check_base_class_offset(lv, (S2519C3*)(S2516C2*), ABISELECT(8,4), "S2516C1");
    check_base_class_offset(lv, (S2516C2*), 0, "S2516C1");
    test_class_info(&lv, &cd_S2516C1);
    dp->~S2516C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2516C1(Test_S2516C1, "S2516C1", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2516C1C1Ev();
extern void _ZN7S2516C1D1Ev();
Name_Map name_map_S2516C1[] = {
  NSPAIR(_ZN7S2516C1C1Ev),
  NSPAIR(_ZN7S2516C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
extern Class_Descriptor cd_S2516C2;
extern VTBL_ENTRY _ZTI7S2516C2[];
extern  VTBL_ENTRY _ZTV7S2516C2[];
static Base_Class bases_S2516C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2516C2,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2516C1[];
extern void _ZN7S2516C22v1Ev();
extern void _ZN7S2516C22v2Ev();
extern void _ZN7S2516C22v3Ev();
extern void _ZN7S2516C22v4Ev();
static  VTBL_ENTRY vtc_S2516C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2516C1[0]),
  (VTBL_ENTRY)&_ZN7S2516C22v1Ev,
  (VTBL_ENTRY)&_ZN7S2516C22v2Ev,
  (VTBL_ENTRY)&_ZN7S2516C22v3Ev,
  (VTBL_ENTRY)&_ZN7S2516C22v4Ev,
};
extern VTBL_ENTRY _ZTI7S2516C1[];
extern  VTBL_ENTRY _ZTV7S2516C1[];
Class_Descriptor cd_S2516C1 = {  "S2516C1", // class name
  bases_S2516C1, 2,
  &(vtc_S2516C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2516C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2516C1),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8696C2  {
  int s8696c2f0;
  char s8696c2f1[2050];
  virtual  ~S8696C2(); // _ZN7S8696C2D1Ev
  virtual void  v2(); // _ZN7S8696C22v2Ev
  S8696C2(); // tgen
};
//SIG(-1 S8696C2) C1{ vd v1 Fi Fc[2050]}


 S8696C2 ::~S8696C2(){ note_dtor("S8696C2", this);}
void  S8696C2 ::v2(){vfunc_called(this, "_ZN7S8696C22v2Ev");}
S8696C2 ::S8696C2(){ note_ctor("S8696C2", this);} // tgen

static void Test_S8696C2()
{
  extern Class_Descriptor cd_S8696C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(259,516)];
    init_test(&cd_S8696C2, buf);
    S8696C2 *dp, &lv = *(dp=new (buf) S8696C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2064,2060), "sizeof(S8696C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8696C2)");
    check_field_offset(lv, s8696c2f0, ABISELECT(8,4), "S8696C2.s8696c2f0");
    check_field_offset(lv, s8696c2f1, ABISELECT(12,8), "S8696C2.s8696c2f1");
    test_class_info(&lv, &cd_S8696C2);
    dp->~S8696C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8696C2(Test_S8696C2, "S8696C2", ABISELECT(2064,2060));

#else // __cplusplus

extern void _ZN7S8696C2C1Ev();
extern void _ZN7S8696C2D1Ev();
Name_Map name_map_S8696C2[] = {
  NSPAIR(_ZN7S8696C2C1Ev),
  NSPAIR(_ZN7S8696C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S8696C2[];
extern void _ZN7S8696C2D1Ev();
extern void _ZN7S8696C2D0Ev();
extern void _ZN7S8696C22v2Ev();
static  VTBL_ENTRY vtc_S8696C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8696C2[0]),
  (VTBL_ENTRY)&_ZN7S8696C2D1Ev,
  (VTBL_ENTRY)&_ZN7S8696C2D0Ev,
  (VTBL_ENTRY)&_ZN7S8696C22v2Ev,
};
extern VTBL_ENTRY _ZTI7S8696C2[];
extern  VTBL_ENTRY _ZTV7S8696C2[];
Class_Descriptor cd_S8696C2 = {  "S8696C2", // class name
  0,0,//no base classes
  &(vtc_S8696C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2064,2060), // object size
  NSPAIRA(_ZTI7S8696C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S8696C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8696C1  : S8696C2 {
  int s8696c1f0;
  void *s8696c1f1[2];
  virtual  ~S8696C1(); // _ZN7S8696C1D1Ev
  virtual void  v1(); // _ZN7S8696C12v1Ev
  S8696C1(); // tgen
};
//SIG(1 S8696C1) C1{ BC2{ vd v2 Fi Fc[2050]} vd v1 Fi Fp[2]}


 S8696C1 ::~S8696C1(){ note_dtor("S8696C1", this);}
void  S8696C1 ::v1(){vfunc_called(this, "_ZN7S8696C12v1Ev");}
S8696C1 ::S8696C1(){ note_ctor("S8696C1", this);} // tgen

static void Test_S8696C1()
{
  extern Class_Descriptor cd_S8696C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(262,519)];
    init_test(&cd_S8696C1, buf);
    S8696C1 *dp, &lv = *(dp=new (buf) S8696C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2088,2072), "sizeof(S8696C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8696C1)");
    check_base_class_offset(lv, (S8696C2*), 0, "S8696C1");
    check_field_offset(lv, s8696c1f0, ABISELECT(2064,2060), "S8696C1.s8696c1f0");
    check_field_offset(lv, s8696c1f1, ABISELECT(2072,2064), "S8696C1.s8696c1f1");
    test_class_info(&lv, &cd_S8696C1);
    dp->~S8696C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8696C1(Test_S8696C1, "S8696C1", ABISELECT(2088,2072));

#else // __cplusplus

extern void _ZN7S8696C1C1Ev();
extern void _ZN7S8696C1D1Ev();
Name_Map name_map_S8696C1[] = {
  NSPAIR(_ZN7S8696C1C1Ev),
  NSPAIR(_ZN7S8696C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S8696C2;
extern VTBL_ENTRY _ZTI7S8696C2[];
extern  VTBL_ENTRY _ZTV7S8696C2[];
static Base_Class bases_S8696C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S8696C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8696C1[];
extern void _ZN7S8696C1D1Ev();
extern void _ZN7S8696C1D0Ev();
extern void _ZN7S8696C22v2Ev();
extern void _ZN7S8696C12v1Ev();
static  VTBL_ENTRY vtc_S8696C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8696C1[0]),
  (VTBL_ENTRY)&_ZN7S8696C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8696C1D0Ev,
  (VTBL_ENTRY)&_ZN7S8696C22v2Ev,
  (VTBL_ENTRY)&_ZN7S8696C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S8696C1[];
extern  VTBL_ENTRY _ZTV7S8696C1[];
Class_Descriptor cd_S8696C1 = {  "S8696C1", // class name
  bases_S8696C1, 1,
  &(vtc_S8696C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2088,2072), // object size
  NSPAIRA(_ZTI7S8696C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8696C1),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14929C2_nt  {
  __tsi64 s14929c2f0[2];
};
//SIG(-1 S14929C2_nt) C1{ FL[2]}



//skip512 S14929C2_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14929C1  {
  short s14929c1f0[3];
  long s14929c1f1[2];
  short s14929c1f2;
  char s14929c1f3[32];
  short s14929c1f4;
  ::S14929C2_nt s14929c1f5;
};
//SIG(1 S14929C1) C1{ Fs[3] Fl[2] Fs Fc[32] Fs FC2{ FL[2]}}



static void Test_S14929C1()
{
  {
    init_simple_test("S14929C1");
    S14929C1 lv;
    check2(sizeof(lv), ABISELECT(80,68), "sizeof(S14929C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14929C1)");
    check_field_offset(lv, s14929c1f0, 0, "S14929C1.s14929c1f0");
    check_field_offset(lv, s14929c1f1, 8, "S14929C1.s14929c1f1");
    check_field_offset(lv, s14929c1f2, ABISELECT(24,16), "S14929C1.s14929c1f2");
    check_field_offset(lv, s14929c1f3, ABISELECT(26,18), "S14929C1.s14929c1f3");
    check_field_offset(lv, s14929c1f4, ABISELECT(58,50), "S14929C1.s14929c1f4");
    check_field_offset(lv, s14929c1f5, ABISELECT(64,52), "S14929C1.s14929c1f5");
  }
}
static Arrange_To_Call_Me vS14929C1(Test_S14929C1, "S14929C1", ABISELECT(80,68));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

union  S21592C3  {
  int s21592c3f0;
  int s21592c3f1;
  void *s21592c3f2;
};
//SIG(1 S21592C3) U1{ Fi Fi Fp}

#endif // __cplusplus
#ifdef __cplusplus

struct  S21592C2  {
  int s21592c2f0;
  ::S21592C3 s21592c2f1;
  void  mf21592c2(); // _ZN8S21592C29mf21592c2Ev
};
//SIG(1 S21592C2) C1{ m Fi FU2{ Fi Fi Fp}}


void  S21592C2 ::mf21592c2(){}

static void Test_S21592C2()
{
  {
    init_simple_test("S21592C2");
    S21592C2 lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S21592C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21592C2)");
    check_field_offset(lv, s21592c2f0, 0, "S21592C2.s21592c2f0");
    check_field_offset(lv, s21592c2f1, ABISELECT(8,4), "S21592C2.s21592c2f1");
  }
}
static Arrange_To_Call_Me vS21592C2(Test_S21592C2, "S21592C2", ABISELECT(16,8));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S21592C1  {
  int s21592c1f0;
  ::S21592C2 s21592c1f1[3];
  void  mf21592c1(); // _ZN8S21592C19mf21592c1Ev
  virtual  ~S21592C1(); // _ZN8S21592C1D1Ev
  S21592C1(); // tgen
};
//SIG(1 S21592C1) C1{ vd m Fi FC2{ m Fi FU3{ Fi Fi Fp}}[3]}


void  S21592C1 ::mf21592c1(){}
 S21592C1 ::~S21592C1(){ note_dtor("S21592C1", this);}
S21592C1 ::S21592C1(){ note_ctor("S21592C1", this);} // tgen

static void Test_S21592C1()
{
  extern Class_Descriptor cd_S21592C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[9];
    init_test(&cd_S21592C1, buf);
    S21592C1 *dp, &lv = *(dp=new (buf) S21592C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,32), "sizeof(S21592C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21592C1)");
    check_field_offset(lv, s21592c1f0, ABISELECT(8,4), "S21592C1.s21592c1f0");
    check_field_offset(lv, s21592c1f1, ABISELECT(16,8), "S21592C1.s21592c1f1");
    test_class_info(&lv, &cd_S21592C1);
    dp->~S21592C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS21592C1(Test_S21592C1, "S21592C1", ABISELECT(64,32));

#else // __cplusplus

extern void _ZN8S21592C1C1Ev();
extern void _ZN8S21592C1D1Ev();
Name_Map name_map_S21592C1[] = {
  NSPAIR(_ZN8S21592C1C1Ev),
  NSPAIR(_ZN8S21592C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S21592C1[];
extern void _ZN8S21592C1D1Ev();
extern void _ZN8S21592C1D0Ev();
static  VTBL_ENTRY vtc_S21592C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S21592C1[0]),
  (VTBL_ENTRY)&_ZN8S21592C1D1Ev,
  (VTBL_ENTRY)&_ZN8S21592C1D0Ev,
};
extern VTBL_ENTRY _ZTI8S21592C1[];
extern  VTBL_ENTRY _ZTV8S21592C1[];
Class_Descriptor cd_S21592C1 = {  "S21592C1", // class name
  0,0,//no base classes
  &(vtc_S21592C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(64,32), // object size
  NSPAIRA(_ZTI8S21592C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S21592C1),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17501C3_nt  {
  int s17501c3f0[2];
  void  mf17501c3(); // _ZN11S17501C3_nt9mf17501c3Ev
};
//SIG(-1 S17501C3_nt) C1{ m Fi[2]}


void  S17501C3_nt ::mf17501c3(){}

//skip512 S17501C3_nt

#else // __cplusplus

Class_Descriptor cd_S17501C3_nt = {  "S17501C3_nt", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  8, // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17501C2  : S17501C3_nt {
  void *s17501c2f0[2];
  int s17501c2f1[4];
};
//SIG(-1 S17501C2) C1{ BC2{ m Fi[2]} Fp[2] Fi[4]}



static void Test_S17501C2()
{
  extern Class_Descriptor cd_S17501C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_S17501C2, buf);
    S17501C2 &lv = *(new (buf) S17501C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(S17501C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17501C2)");
    check_base_class_offset(lv, (S17501C3_nt*), 0, "S17501C2");
    check_field_offset(lv, s17501c2f0, 8, "S17501C2.s17501c2f0");
    check_field_offset(lv, s17501c2f1, ABISELECT(24,16), "S17501C2.s17501c2f1");
    test_class_info(&lv, &cd_S17501C2);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS17501C2(Test_S17501C2, "S17501C2", ABISELECT(40,32));

#else // __cplusplus

extern Class_Descriptor cd_S17501C3_nt;
static Base_Class bases_S17501C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S17501C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S17501C2 = {  "S17501C2", // class name
  bases_S17501C2, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(40,32), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17501C1  {
  void *s17501c1f0;
  ::S17501C2 s17501c1f1;
  void  mf17501c1(); // _ZN8S17501C19mf17501c1Ev
};
//SIG(1 S17501C1) C1{ m Fp FC2{ BC3{ m Fi[2]} Fp[2] Fi[4]}}


void  S17501C1 ::mf17501c1(){}

static void Test_S17501C1()
{
  {
    init_simple_test("S17501C1");
    S17501C1 lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(S17501C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17501C1)");
    check_field_offset(lv, s17501c1f0, 0, "S17501C1.s17501c1f0");
    check_field_offset(lv, s17501c1f1, ABISELECT(8,4), "S17501C1.s17501c1f1");
  }
}
static Arrange_To_Call_Me vS17501C1(Test_S17501C1, "S17501C1", ABISELECT(48,36));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15021C1  {
  char s15021c1f0;
  ::S15016C6 s15021c1f1;
  ::S15016C6 s15021c1f2;
  void  mf15021c1(); // _ZN8S15021C19mf15021c1Ev
};
//SIG(1 S15021C1) C1{ m Fc FC2{ BC3{ BC4{ m Fp Fi[2]}}} FC2}


void  S15021C1 ::mf15021c1(){}

static void Test_S15021C1()
{
  {
    init_simple_test("S15021C1");
    S15021C1 lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S15021C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15021C1)");
    check_field_offset(lv, s15021c1f0, 0, "S15021C1.s15021c1f0");
    check_field_offset(lv, s15021c1f1, ABISELECT(8,4), "S15021C1.s15021c1f1");
    check_field_offset(lv, s15021c1f2, ABISELECT(24,16), "S15021C1.s15021c1f2");
  }
}
static Arrange_To_Call_Me vS15021C1(Test_S15021C1, "S15021C1", ABISELECT(40,28));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8698C2  {
  int s8698c2f0;
  char s8698c2f1[2050];
  virtual  ~S8698C2(); // _ZN7S8698C2D1Ev
  virtual void  v2(); // _ZN7S8698C22v2Ev
  S8698C2(); // tgen
};
//SIG(-1 S8698C2) C1{ vd v1 Fi Fc[2050]}


 S8698C2 ::~S8698C2(){ note_dtor("S8698C2", this);}
void  S8698C2 ::v2(){vfunc_called(this, "_ZN7S8698C22v2Ev");}
S8698C2 ::S8698C2(){ note_ctor("S8698C2", this);} // tgen

static void Test_S8698C2()
{
  extern Class_Descriptor cd_S8698C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(259,516)];
    init_test(&cd_S8698C2, buf);
    S8698C2 *dp, &lv = *(dp=new (buf) S8698C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2064,2060), "sizeof(S8698C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8698C2)");
    check_field_offset(lv, s8698c2f0, ABISELECT(8,4), "S8698C2.s8698c2f0");
    check_field_offset(lv, s8698c2f1, ABISELECT(12,8), "S8698C2.s8698c2f1");
    test_class_info(&lv, &cd_S8698C2);
    dp->~S8698C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8698C2(Test_S8698C2, "S8698C2", ABISELECT(2064,2060));

#else // __cplusplus

extern void _ZN7S8698C2C1Ev();
extern void _ZN7S8698C2D1Ev();
Name_Map name_map_S8698C2[] = {
  NSPAIR(_ZN7S8698C2C1Ev),
  NSPAIR(_ZN7S8698C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S8698C2[];
extern void _ZN7S8698C2D1Ev();
extern void _ZN7S8698C2D0Ev();
extern void _ZN7S8698C22v2Ev();
static  VTBL_ENTRY vtc_S8698C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8698C2[0]),
  (VTBL_ENTRY)&_ZN7S8698C2D1Ev,
  (VTBL_ENTRY)&_ZN7S8698C2D0Ev,
  (VTBL_ENTRY)&_ZN7S8698C22v2Ev,
};
extern VTBL_ENTRY _ZTI7S8698C2[];
extern  VTBL_ENTRY _ZTV7S8698C2[];
Class_Descriptor cd_S8698C2 = {  "S8698C2", // class name
  0,0,//no base classes
  &(vtc_S8698C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2064,2060), // object size
  NSPAIRA(_ZTI7S8698C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S8698C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8698C1  : S8698C2 {
  int s8698c1f0;
  void *s8698c1f1;
  virtual  ~S8698C1(); // _ZN7S8698C1D1Ev
  virtual void  v1(); // _ZN7S8698C12v1Ev
  S8698C1(); // tgen
};
//SIG(1 S8698C1) C1{ BC2{ vd v2 Fi Fc[2050]} vd v1 Fi Fp}


 S8698C1 ::~S8698C1(){ note_dtor("S8698C1", this);}
void  S8698C1 ::v1(){vfunc_called(this, "_ZN7S8698C12v1Ev");}
S8698C1 ::S8698C1(){ note_ctor("S8698C1", this);} // tgen

static void Test_S8698C1()
{
  extern Class_Descriptor cd_S8698C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(261,518)];
    init_test(&cd_S8698C1, buf);
    S8698C1 *dp, &lv = *(dp=new (buf) S8698C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2080,2068), "sizeof(S8698C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8698C1)");
    check_base_class_offset(lv, (S8698C2*), 0, "S8698C1");
    check_field_offset(lv, s8698c1f0, ABISELECT(2064,2060), "S8698C1.s8698c1f0");
    check_field_offset(lv, s8698c1f1, ABISELECT(2072,2064), "S8698C1.s8698c1f1");
    test_class_info(&lv, &cd_S8698C1);
    dp->~S8698C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8698C1(Test_S8698C1, "S8698C1", ABISELECT(2080,2068));

#else // __cplusplus

extern void _ZN7S8698C1C1Ev();
extern void _ZN7S8698C1D1Ev();
Name_Map name_map_S8698C1[] = {
  NSPAIR(_ZN7S8698C1C1Ev),
  NSPAIR(_ZN7S8698C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S8698C2;
extern VTBL_ENTRY _ZTI7S8698C2[];
extern  VTBL_ENTRY _ZTV7S8698C2[];
static Base_Class bases_S8698C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S8698C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8698C1[];
extern void _ZN7S8698C1D1Ev();
extern void _ZN7S8698C1D0Ev();
extern void _ZN7S8698C22v2Ev();
extern void _ZN7S8698C12v1Ev();
static  VTBL_ENTRY vtc_S8698C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8698C1[0]),
  (VTBL_ENTRY)&_ZN7S8698C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8698C1D0Ev,
  (VTBL_ENTRY)&_ZN7S8698C22v2Ev,
  (VTBL_ENTRY)&_ZN7S8698C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S8698C1[];
extern  VTBL_ENTRY _ZTV7S8698C1[];
Class_Descriptor cd_S8698C1 = {  "S8698C1", // class name
  bases_S8698C1, 1,
  &(vtc_S8698C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2080,2068), // object size
  NSPAIRA(_ZTI7S8698C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8698C1),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S21809C1  {
  void *s21809c1f0[2];
  int s21809c1f1[2];
  void *s21809c1f2;
  ::S10104C22_nt s21809c1f3;
  void  mf21809c1(); // _ZN8S21809C19mf21809c1Ev
  virtual  ~S21809C1(); // _ZN8S21809C1D1Ev
  S21809C1(); // tgen
};
//SIG(1 S21809C1) C1{ vd m Fp[2] Fi[2] Fp FC2{ m FL[4]}}


void  S21809C1 ::mf21809c1(){}
 S21809C1 ::~S21809C1(){ note_dtor("S21809C1", this);}
S21809C1 ::S21809C1(){ note_ctor("S21809C1", this);} // tgen

static void Test_S21809C1()
{
  extern Class_Descriptor cd_S21809C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,15)];
    init_test(&cd_S21809C1, buf);
    S21809C1 *dp, &lv = *(dp=new (buf) S21809C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,56), "sizeof(S21809C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21809C1)");
    check_field_offset(lv, s21809c1f0, ABISELECT(8,4), "S21809C1.s21809c1f0");
    check_field_offset(lv, s21809c1f1, ABISELECT(24,12), "S21809C1.s21809c1f1");
    check_field_offset(lv, s21809c1f2, ABISELECT(32,20), "S21809C1.s21809c1f2");
    check_field_offset(lv, s21809c1f3, ABISELECT(40,24), "S21809C1.s21809c1f3");
    test_class_info(&lv, &cd_S21809C1);
    dp->~S21809C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS21809C1(Test_S21809C1, "S21809C1", ABISELECT(72,56));

#else // __cplusplus

extern void _ZN8S21809C1C1Ev();
extern void _ZN8S21809C1D1Ev();
Name_Map name_map_S21809C1[] = {
  NSPAIR(_ZN8S21809C1C1Ev),
  NSPAIR(_ZN8S21809C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S21809C1[];
extern void _ZN8S21809C1D1Ev();
extern void _ZN8S21809C1D0Ev();
static  VTBL_ENTRY vtc_S21809C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S21809C1[0]),
  (VTBL_ENTRY)&_ZN8S21809C1D1Ev,
  (VTBL_ENTRY)&_ZN8S21809C1D0Ev,
};
extern VTBL_ENTRY _ZTI8S21809C1[];
extern  VTBL_ENTRY _ZTV8S21809C1[];
Class_Descriptor cd_S21809C1 = {  "S21809C1", // class name
  0,0,//no base classes
  &(vtc_S21809C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,56), // object size
  NSPAIRA(_ZTI8S21809C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S21809C1),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
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

union  S13900C2  {
  __tsi64 s13900c2f0[16];
  char s13900c2f1[128];
};
//SIG(1 S13900C2) U1{ FL[16] Fc[128]}

#endif // __cplusplus
#ifdef __cplusplus

struct  S13900C1  {
  __tsi64 s13900c1f0[10];
  ::S13900C2 s13900c1f1;
  int s13900c1f2;
  int s13900c1f3;
};
//SIG(1 S13900C1) C1{ FL[10] FU2{ FL[16] Fc[128]} Fi Fi}



static void Test_S13900C1()
{
  {
    init_simple_test("S13900C1");
    S13900C1 lv;
    check2(sizeof(lv), 216, "sizeof(S13900C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13900C1)");
    check_field_offset(lv, s13900c1f0, 0, "S13900C1.s13900c1f0");
    check_field_offset(lv, s13900c1f1, 80, "S13900C1.s13900c1f1");
    check_field_offset(lv, s13900c1f2, 208, "S13900C1.s13900c1f2");
    check_field_offset(lv, s13900c1f3, 212, "S13900C1.s13900c1f3");
  }
}
static Arrange_To_Call_Me vS13900C1(Test_S13900C1, "S13900C1", 216);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4626C3  {
  virtual  ~S4626C3(); // _ZN7S4626C3D1Ev
  virtual void  v2(); // _ZN7S4626C32v2Ev
  S4626C3(); // tgen
};
//SIG(-1 S4626C3) C1{ vd v1}


 S4626C3 ::~S4626C3(){ note_dtor("S4626C3", this);}
void  S4626C3 ::v2(){vfunc_called(this, "_ZN7S4626C32v2Ev");}
S4626C3 ::S4626C3(){ note_ctor("S4626C3", this);} // tgen

static void Test_S4626C3()
{
  extern Class_Descriptor cd_S4626C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S4626C3, buf);
    S4626C3 *dp, &lv = *(dp=new (buf) S4626C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S4626C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4626C3)");
    test_class_info(&lv, &cd_S4626C3);
    dp->~S4626C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4626C3(Test_S4626C3, "S4626C3", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN7S4626C3C1Ev();
extern void _ZN7S4626C3D1Ev();
Name_Map name_map_S4626C3[] = {
  NSPAIR(_ZN7S4626C3C1Ev),
  NSPAIR(_ZN7S4626C3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S4626C3[];
extern void _ZN7S4626C3D1Ev();
extern void _ZN7S4626C3D0Ev();
extern void _ZN7S4626C32v2Ev();
static  VTBL_ENTRY vtc_S4626C3[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4626C3[0]),
  (VTBL_ENTRY)&_ZN7S4626C3D1Ev,
  (VTBL_ENTRY)&_ZN7S4626C3D0Ev,
  (VTBL_ENTRY)&_ZN7S4626C32v2Ev,
};
extern VTBL_ENTRY _ZTI7S4626C3[];
extern  VTBL_ENTRY _ZTV7S4626C3[];
Class_Descriptor cd_S4626C3 = {  "S4626C3", // class name
  0,0,//no base classes
  &(vtc_S4626C3[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI7S4626C3),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S4626C3),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4626C2_nt  : S4626C3 {
  virtual  ~S4626C2_nt(); // _ZN10S4626C2_ntD1Ev
  S4626C2_nt(); // tgen
};
//SIG(-1 S4626C2_nt) C1{ BC2{ vd v1} vd}


 S4626C2_nt ::~S4626C2_nt(){ note_dtor("S4626C2_nt", this);}
S4626C2_nt ::S4626C2_nt(){ note_ctor("S4626C2_nt", this);} // tgen

//skip512 S4626C2_nt

#else // __cplusplus

extern void _ZN10S4626C2_ntC1Ev();
extern void _ZN10S4626C2_ntD1Ev();
Name_Map name_map_S4626C2_nt[] = {
  NSPAIR(_ZN10S4626C2_ntC1Ev),
  NSPAIR(_ZN10S4626C2_ntD1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4626C3;
extern VTBL_ENTRY _ZTI7S4626C3[];
extern  VTBL_ENTRY _ZTV7S4626C3[];
static Base_Class bases_S4626C2_nt[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4626C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI10S4626C2_nt[];
extern void _ZN10S4626C2_ntD1Ev();
extern void _ZN10S4626C2_ntD0Ev();
extern void _ZN7S4626C32v2Ev();
static  VTBL_ENTRY vtc_S4626C2_nt[] = {
  0,
  (VTBL_ENTRY)&(_ZTI10S4626C2_nt[0]),
  (VTBL_ENTRY)&_ZN10S4626C2_ntD1Ev,
  (VTBL_ENTRY)&_ZN10S4626C2_ntD0Ev,
  (VTBL_ENTRY)&_ZN7S4626C32v2Ev,
};
extern VTBL_ENTRY _ZTI10S4626C2_nt[];
VTBL_ENTRY *P__ZTI10S4626C2_nt = _ZTI10S4626C2_nt; 
extern  VTBL_ENTRY _ZTV10S4626C2_nt[];
Class_Descriptor cd_S4626C2_nt = {  "S4626C2_nt", // class name
  bases_S4626C2_nt, 1,
  &(vtc_S4626C2_nt[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI10S4626C2_nt),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV10S4626C2_nt),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S4626C1  : S4626C2_nt {
  void *s4626c1f0;
  char s4626c1f1;
  void *s4626c1f2;
  virtual  ~S4626C1(); // _ZN7S4626C1D1Ev
  virtual void  v1(); // _ZN7S4626C12v1Ev
  S4626C1(); // tgen
};
//SIG(1 S4626C1) C1{ BC2{ BC3{ vd v2} vd} vd v1 Fp Fc Fp}


 S4626C1 ::~S4626C1(){ note_dtor("S4626C1", this);}
void  S4626C1 ::v1(){vfunc_called(this, "_ZN7S4626C12v1Ev");}
S4626C1 ::S4626C1(){ note_ctor("S4626C1", this);} // tgen

static void Test_S4626C1()
{
  extern Class_Descriptor cd_S4626C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[5];
    init_test(&cd_S4626C1, buf);
    S4626C1 *dp, &lv = *(dp=new (buf) S4626C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,16), "sizeof(S4626C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S4626C1)");
    check_base_class_offset(lv, (S4626C3*)(S4626C2_nt*), 0, "S4626C1");
    check_base_class_offset(lv, (S4626C2_nt*), 0, "S4626C1");
    check_field_offset(lv, s4626c1f0, ABISELECT(8,4), "S4626C1.s4626c1f0");
    check_field_offset(lv, s4626c1f1, ABISELECT(16,8), "S4626C1.s4626c1f1");
    check_field_offset(lv, s4626c1f2, ABISELECT(24,12), "S4626C1.s4626c1f2");
    test_class_info(&lv, &cd_S4626C1);
    dp->~S4626C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS4626C1(Test_S4626C1, "S4626C1", ABISELECT(32,16));

#else // __cplusplus

extern void _ZN7S4626C1C1Ev();
extern void _ZN7S4626C1D1Ev();
Name_Map name_map_S4626C1[] = {
  NSPAIR(_ZN7S4626C1C1Ev),
  NSPAIR(_ZN7S4626C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S4626C3;
extern VTBL_ENTRY _ZTI7S4626C3[];
extern  VTBL_ENTRY _ZTV7S4626C3[];
extern Class_Descriptor cd_S4626C2_nt;
extern VTBL_ENTRY _ZTI10S4626C2_nt[];
extern  VTBL_ENTRY _ZTV10S4626C2_nt[];
static Base_Class bases_S4626C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S4626C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S4626C2_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S4626C1[];
extern void _ZN7S4626C1D1Ev();
extern void _ZN7S4626C1D0Ev();
extern void _ZN7S4626C32v2Ev();
extern void _ZN7S4626C12v1Ev();
static  VTBL_ENTRY vtc_S4626C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S4626C1[0]),
  (VTBL_ENTRY)&_ZN7S4626C1D1Ev,
  (VTBL_ENTRY)&_ZN7S4626C1D0Ev,
  (VTBL_ENTRY)&_ZN7S4626C32v2Ev,
  (VTBL_ENTRY)&_ZN7S4626C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S4626C1[];
extern  VTBL_ENTRY _ZTV7S4626C1[];
Class_Descriptor cd_S4626C1 = {  "S4626C1", // class name
  bases_S4626C1, 2,
  &(vtc_S4626C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,16), // object size
  NSPAIRA(_ZTI7S4626C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S4626C1),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

struct  S5731C1  : S2519C3 {
  ::S2718C3_nt s5731c1f0;
};
//SIG(1 S5731C1) C1{ BC2{ m Fi Fc Fl FL Fp} FC3{ m Fi}}



static void Test_S5731C1()
{
  extern Class_Descriptor cd_S5731C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S5731C1, buf);
    S5731C1 &lv = *(new (buf) S5731C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S5731C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5731C1)");
    check_base_class_offset(lv, (S2519C3*), 0, "S5731C1");
    check_field_offset(lv, s5731c1f0, ABISELECT(32,24), "S5731C1.s5731c1f0");
    test_class_info(&lv, &cd_S5731C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5731C1(Test_S5731C1, "S5731C1", ABISELECT(40,28));

#else // __cplusplus

extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S5731C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5731C1 = {  "S5731C1", // class name
  bases_S5731C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(40,28), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S2517C2  : S2519C3 {
  virtual void  v2(); // _ZN7S2517C22v2Ev
  ~S2517C2(); // tgen
  S2517C2(); // tgen
};
//SIG(-1 S2517C2) C1{ BC2{ m Fi Fc Fl FL Fp} v1}


void  S2517C2 ::v2(){vfunc_called(this, "_ZN7S2517C22v2Ev");}
S2517C2 ::~S2517C2(){ note_dtor("S2517C2", this);} // tgen
S2517C2 ::S2517C2(){ note_ctor("S2517C2", this);} // tgen

static void Test_S2517C2()
{
  extern Class_Descriptor cd_S2517C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2517C2, buf);
    S2517C2 *dp, &lv = *(dp=new (buf) S2517C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2517C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2517C2)");
    check_base_class_offset(lv, (S2519C3*), ABISELECT(8,4), "S2517C2");
    test_class_info(&lv, &cd_S2517C2);
    dp->~S2517C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2517C2(Test_S2517C2, "S2517C2", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2517C2C1Ev();
extern void _ZN7S2517C2D1Ev();
Name_Map name_map_S2517C2[] = {
  NSPAIR(_ZN7S2517C2C1Ev),
  NSPAIR(_ZN7S2517C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S2517C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2517C2[];
extern void _ZN7S2517C22v2Ev();
static  VTBL_ENTRY vtc_S2517C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2517C2[0]),
  (VTBL_ENTRY)&_ZN7S2517C22v2Ev,
};
extern VTBL_ENTRY _ZTI7S2517C2[];
extern  VTBL_ENTRY _ZTV7S2517C2[];
Class_Descriptor cd_S2517C2 = {  "S2517C2", // class name
  bases_S2517C2, 1,
  &(vtc_S2517C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2517C2),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7S2517C2),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

struct  S2517C1  : S2517C2 {
  virtual void  v1(); // _ZN7S2517C12v1Ev
  ~S2517C1(); // tgen
  S2517C1(); // tgen
};
//SIG(1 S2517C1) C1{ BC2{ BC3{ m Fi Fc Fl FL Fp} v2} v1}


void  S2517C1 ::v1(){vfunc_called(this, "_ZN7S2517C12v1Ev");}
S2517C1 ::~S2517C1(){ note_dtor("S2517C1", this);} // tgen
S2517C1 ::S2517C1(){ note_ctor("S2517C1", this);} // tgen

static void Test_S2517C1()
{
  extern Class_Descriptor cd_S2517C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S2517C1, buf);
    S2517C1 *dp, &lv = *(dp=new (buf) S2517C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S2517C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S2517C1)");
    check_base_class_offset(lv, (S2519C3*)(S2517C2*), ABISELECT(8,4), "S2517C1");
    check_base_class_offset(lv, (S2517C2*), 0, "S2517C1");
    test_class_info(&lv, &cd_S2517C1);
    dp->~S2517C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS2517C1(Test_S2517C1, "S2517C1", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S2517C1C1Ev();
extern void _ZN7S2517C1D1Ev();
Name_Map name_map_S2517C1[] = {
  NSPAIR(_ZN7S2517C1C1Ev),
  NSPAIR(_ZN7S2517C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
extern Class_Descriptor cd_S2517C2;
extern VTBL_ENTRY _ZTI7S2517C2[];
extern  VTBL_ENTRY _ZTV7S2517C2[];
static Base_Class bases_S2517C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_S2517C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S2517C1[];
extern void _ZN7S2517C22v2Ev();
extern void _ZN7S2517C12v1Ev();
static  VTBL_ENTRY vtc_S2517C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S2517C1[0]),
  (VTBL_ENTRY)&_ZN7S2517C22v2Ev,
  (VTBL_ENTRY)&_ZN7S2517C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S2517C1[];
extern  VTBL_ENTRY _ZTV7S2517C1[];
Class_Descriptor cd_S2517C1 = {  "S2517C1", // class name
  bases_S2517C1, 2,
  &(vtc_S2517C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S2517C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S2517C1),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8699C2  {
  int s8699c2f0;
  char s8699c2f1[2050];
  virtual  ~S8699C2(); // _ZN7S8699C2D1Ev
  virtual void  v2(); // _ZN7S8699C22v2Ev
  S8699C2(); // tgen
};
//SIG(-1 S8699C2) C1{ vd v1 Fi Fc[2050]}


 S8699C2 ::~S8699C2(){ note_dtor("S8699C2", this);}
void  S8699C2 ::v2(){vfunc_called(this, "_ZN7S8699C22v2Ev");}
S8699C2 ::S8699C2(){ note_ctor("S8699C2", this);} // tgen

static void Test_S8699C2()
{
  extern Class_Descriptor cd_S8699C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(259,516)];
    init_test(&cd_S8699C2, buf);
    S8699C2 *dp, &lv = *(dp=new (buf) S8699C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2064,2060), "sizeof(S8699C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8699C2)");
    check_field_offset(lv, s8699c2f0, ABISELECT(8,4), "S8699C2.s8699c2f0");
    check_field_offset(lv, s8699c2f1, ABISELECT(12,8), "S8699C2.s8699c2f1");
    test_class_info(&lv, &cd_S8699C2);
    dp->~S8699C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8699C2(Test_S8699C2, "S8699C2", ABISELECT(2064,2060));

#else // __cplusplus

extern void _ZN7S8699C2C1Ev();
extern void _ZN7S8699C2D1Ev();
Name_Map name_map_S8699C2[] = {
  NSPAIR(_ZN7S8699C2C1Ev),
  NSPAIR(_ZN7S8699C2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI7S8699C2[];
extern void _ZN7S8699C2D1Ev();
extern void _ZN7S8699C2D0Ev();
extern void _ZN7S8699C22v2Ev();
static  VTBL_ENTRY vtc_S8699C2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8699C2[0]),
  (VTBL_ENTRY)&_ZN7S8699C2D1Ev,
  (VTBL_ENTRY)&_ZN7S8699C2D0Ev,
  (VTBL_ENTRY)&_ZN7S8699C22v2Ev,
};
extern VTBL_ENTRY _ZTI7S8699C2[];
extern  VTBL_ENTRY _ZTV7S8699C2[];
Class_Descriptor cd_S8699C2 = {  "S8699C2", // class name
  0,0,//no base classes
  &(vtc_S8699C2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2064,2060), // object size
  NSPAIRA(_ZTI7S8699C2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV7S8699C2),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S8699C1  : S8699C2 {
  void *s8699c1f0;
  virtual  ~S8699C1(); // _ZN7S8699C1D1Ev
  virtual void  v1(); // _ZN7S8699C12v1Ev
  S8699C1(); // tgen
};
//SIG(1 S8699C1) C1{ BC2{ vd v2 Fi Fc[2050]} vd v1 Fp}


 S8699C1 ::~S8699C1(){ note_dtor("S8699C1", this);}
void  S8699C1 ::v1(){vfunc_called(this, "_ZN7S8699C12v1Ev");}
S8699C1 ::S8699C1(){ note_ctor("S8699C1", this);} // tgen

static void Test_S8699C1()
{
  extern Class_Descriptor cd_S8699C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(260,517)];
    init_test(&cd_S8699C1, buf);
    S8699C1 *dp, &lv = *(dp=new (buf) S8699C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(2072,2064), "sizeof(S8699C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S8699C1)");
    check_base_class_offset(lv, (S8699C2*), 0, "S8699C1");
    check_field_offset(lv, s8699c1f0, ABISELECT(2064,2060), "S8699C1.s8699c1f0");
    test_class_info(&lv, &cd_S8699C1);
    dp->~S8699C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS8699C1(Test_S8699C1, "S8699C1", ABISELECT(2072,2064));

#else // __cplusplus

extern void _ZN7S8699C1C1Ev();
extern void _ZN7S8699C1D1Ev();
Name_Map name_map_S8699C1[] = {
  NSPAIR(_ZN7S8699C1C1Ev),
  NSPAIR(_ZN7S8699C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S8699C2;
extern VTBL_ENTRY _ZTI7S8699C2[];
extern  VTBL_ENTRY _ZTV7S8699C2[];
static Base_Class bases_S8699C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S8699C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S8699C1[];
extern void _ZN7S8699C1D1Ev();
extern void _ZN7S8699C1D0Ev();
extern void _ZN7S8699C22v2Ev();
extern void _ZN7S8699C12v1Ev();
static  VTBL_ENTRY vtc_S8699C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S8699C1[0]),
  (VTBL_ENTRY)&_ZN7S8699C1D1Ev,
  (VTBL_ENTRY)&_ZN7S8699C1D0Ev,
  (VTBL_ENTRY)&_ZN7S8699C22v2Ev,
  (VTBL_ENTRY)&_ZN7S8699C12v1Ev,
};
extern VTBL_ENTRY _ZTI7S8699C1[];
extern  VTBL_ENTRY _ZTV7S8699C1[];
Class_Descriptor cd_S8699C1 = {  "S8699C1", // class name
  bases_S8699C1, 1,
  &(vtc_S8699C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(2072,2064), // object size
  NSPAIRA(_ZTI7S8699C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S8699C1),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10356C1  : S10103C109_nt {
  int s10356c1f0;
  ::S10103C14_nt s10356c1f1;
  int s10356c1f2;
};
//SIG(1 S10356C1) C1{ BC2{} Fi FC3{ m Fp Fi FC4{ m}} Fi}



static void Test_S10356C1()
{
  extern Class_Descriptor cd_S10356C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_S10356C1, buf);
    S10356C1 &lv = *(new (buf) S10356C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(S10356C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10356C1)");
    check_base_class_offset(lv, (S10103C109_nt*), 0, "S10356C1");
    check_field_offset(lv, s10356c1f0, 0, "S10356C1.s10356c1f0");
    check_field_offset(lv, s10356c1f1, ABISELECT(8,4), "S10356C1.s10356c1f1");
    check_field_offset(lv, s10356c1f2, ABISELECT(24,16), "S10356C1.s10356c1f2");
    test_class_info(&lv, &cd_S10356C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS10356C1(Test_S10356C1, "S10356C1", ABISELECT(32,20));

#else // __cplusplus

extern Class_Descriptor cd_S10103C109_nt;
extern VTBL_ENTRY _ZTI13S10103C109_nt[];
static Base_Class bases_S10356C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C109_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S10356C1 = {  "S10356C1", // class name
  bases_S10356C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(32,20), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5861C1  : S2718C3_nt {
  ::S10103C14_nt s5861c1f0;
};
//SIG(1 S5861C1) C1{ BC2{ m Fi} FC3{ m Fp Fi FC4{ m}}}



static void Test_S5861C1()
{
  extern Class_Descriptor cd_S5861C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_S5861C1, buf);
    S5861C1 &lv = *(new (buf) S5861C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S5861C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5861C1)");
    check_base_class_offset(lv, (S2718C3_nt*), 0, "S5861C1");
    check_field_offset(lv, s5861c1f0, ABISELECT(8,4), "S5861C1.s5861c1f0");
    test_class_info(&lv, &cd_S5861C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5861C1(Test_S5861C1, "S5861C1", ABISELECT(24,16));

#else // __cplusplus

extern Class_Descriptor cd_S2718C3_nt;
static Base_Class bases_S5861C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2718C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5861C1 = {  "S5861C1", // class name
  bases_S5861C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(24,16), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  1, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12870C3  {
  short s12870c3f0;
  short s12870c3f1;
  void *s12870c3f2;
  void *s12870c3f3;
  short s12870c3f4;
};
//SIG(1 S12870C3) C1{ Fs[2] Fp[2] Fs}



static void Test_S12870C3()
{
  {
    init_simple_test("S12870C3");
    S12870C3 lv;
    check2(sizeof(lv), ABISELECT(32,16), "sizeof(S12870C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S12870C3)");
    check_field_offset(lv, s12870c3f0, 0, "S12870C3.s12870c3f0");
    check_field_offset(lv, s12870c3f1, 2, "S12870C3.s12870c3f1");
    check_field_offset(lv, s12870c3f2, ABISELECT(8,4), "S12870C3.s12870c3f2");
    check_field_offset(lv, s12870c3f3, ABISELECT(16,8), "S12870C3.s12870c3f3");
    check_field_offset(lv, s12870c3f4, ABISELECT(24,12), "S12870C3.s12870c3f4");
  }
}
static Arrange_To_Call_Me vS12870C3(Test_S12870C3, "S12870C3", ABISELECT(32,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

union  S12870C2  {
  ::S12870C3 s12870c2f0;
};
//SIG(1 S12870C2) U1{ FC2{ Fs Fs Fp Fp Fs}}

#endif // __cplusplus
#ifdef __cplusplus

struct  S12870C1  {
  int s12870c1f0;
  ::S12870C2 s12870c1f1;
};
//SIG(1 S12870C1) C1{ Fi FU2{ FC3{ Fs Fs Fp Fp Fs}}}



static void Test_S12870C1()
{
  {
    init_simple_test("S12870C1");
    S12870C1 lv;
    check2(sizeof(lv), ABISELECT(40,20), "sizeof(S12870C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S12870C1)");
    check_field_offset(lv, s12870c1f0, 0, "S12870C1.s12870c1f0");
    check_field_offset(lv, s12870c1f1, ABISELECT(8,4), "S12870C1.s12870c1f1");
  }
}
static Arrange_To_Call_Me vS12870C1(Test_S12870C1, "S12870C1", ABISELECT(40,20));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13021C1  {
  int s13021c1f0[2];
  char s13021c1f1[32];
  int s13021c1f2[2];
  __tsi64 s13021c1f3;
  int s13021c1f4[2];
};
//SIG(1 S13021C1) C1{ Fi[2] Fc[32] Fi[2] FL Fi[2]}



static void Test_S13021C1()
{
  {
    init_simple_test("S13021C1");
    S13021C1 lv;
    check2(sizeof(lv), 64, "sizeof(S13021C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13021C1)");
    check_field_offset(lv, s13021c1f0, 0, "S13021C1.s13021c1f0");
    check_field_offset(lv, s13021c1f1, 8, "S13021C1.s13021c1f1");
    check_field_offset(lv, s13021c1f2, 40, "S13021C1.s13021c1f2");
    check_field_offset(lv, s13021c1f3, 48, "S13021C1.s13021c1f3");
    check_field_offset(lv, s13021c1f4, 56, "S13021C1.s13021c1f4");
  }
}
static Arrange_To_Call_Me vS13021C1(Test_S13021C1, "S13021C1", 64);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17410C1  {
  __tsi64 s17410c1f0[3];
  ::S10103C14_nt s17410c1f1;
  void  mf17410c1(); // _ZN8S17410C19mf17410c1Ev
};
//SIG(1 S17410C1) C1{ m FL[3] FC2{ m Fp Fi FC3{ m}}}


void  S17410C1 ::mf17410c1(){}

static void Test_S17410C1()
{
  {
    init_simple_test("S17410C1");
    S17410C1 lv;
    check2(sizeof(lv), ABISELECT(40,36), "sizeof(S17410C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17410C1)");
    check_field_offset(lv, s17410c1f0, 0, "S17410C1.s17410c1f0");
    check_field_offset(lv, s17410c1f1, 24, "S17410C1.s17410c1f1");
  }
}
static Arrange_To_Call_Me vS17410C1(Test_S17410C1, "S17410C1", ABISELECT(40,36));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16777C2  {
  __tsi64 s16777c2f0;
  char s16777c2f1[4];
  short s16777c2f2;
  void *s16777c2f3;
  void  mf16777c2(); // _ZN8S16777C29mf16777c2Ev
};
//SIG(-1 S16777C2) C1{ m FL Fc[4] Fs Fp}


void  S16777C2 ::mf16777c2(){}

static void Test_S16777C2()
{
  {
    init_simple_test("S16777C2");
    S16777C2 lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(S16777C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S16777C2)");
    check_field_offset(lv, s16777c2f0, 0, "S16777C2.s16777c2f0");
    check_field_offset(lv, s16777c2f1, 8, "S16777C2.s16777c2f1");
    check_field_offset(lv, s16777c2f2, 12, "S16777C2.s16777c2f2");
    check_field_offset(lv, s16777c2f3, 16, "S16777C2.s16777c2f3");
  }
}
static Arrange_To_Call_Me vS16777C2(Test_S16777C2, "S16777C2", ABISELECT(24,20));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16777C1  {
  int s16777c1f0;
  ::S16777C2 s16777c1f1;
  void  mf16777c1(); // _ZN8S16777C19mf16777c1Ev
};
//SIG(1 S16777C1) C1{ m Fi FC2{ m FL Fc[4] Fs Fp}}


void  S16777C1 ::mf16777c1(){}

static void Test_S16777C1()
{
  {
    init_simple_test("S16777C1");
    S16777C1 lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(S16777C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S16777C1)");
    check_field_offset(lv, s16777c1f0, 0, "S16777C1.s16777c1f0");
    check_field_offset(lv, s16777c1f1, ABISELECT(8,4), "S16777C1.s16777c1f1");
  }
}
static Arrange_To_Call_Me vS16777C1(Test_S16777C1, "S16777C1", ABISELECT(32,24));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S6319C1  : S10103C88 {
  void *s6319c1f0;
  int s6319c1f1;
  char s6319c1f2;
  void *s6319c1f3;
  int s6319c1f4[2];
  virtual  ~S6319C1(); // _ZN7S6319C1D1Ev
  S6319C1(); // tgen
};
//SIG(1 S6319C1) C1{ BC2{ m} vd Fp Fi Fc Fp Fi[2]}


 S6319C1 ::~S6319C1(){ note_dtor("S6319C1", this);}
S6319C1 ::S6319C1(){ note_ctor("S6319C1", this);} // tgen

static void Test_S6319C1()
{
  extern Class_Descriptor cd_S6319C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S6319C1, buf);
    S6319C1 *dp, &lv = *(dp=new (buf) S6319C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S6319C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S6319C1)");
    check_base_class_offset(lv, (S10103C88*), 0, "S6319C1");
    check_field_offset(lv, s6319c1f0, ABISELECT(8,4), "S6319C1.s6319c1f0");
    check_field_offset(lv, s6319c1f1, ABISELECT(16,8), "S6319C1.s6319c1f1");
    check_field_offset(lv, s6319c1f2, ABISELECT(20,12), "S6319C1.s6319c1f2");
    check_field_offset(lv, s6319c1f3, ABISELECT(24,16), "S6319C1.s6319c1f3");
    check_field_offset(lv, s6319c1f4, ABISELECT(32,20), "S6319C1.s6319c1f4");
    test_class_info(&lv, &cd_S6319C1);
    dp->~S6319C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS6319C1(Test_S6319C1, "S6319C1", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7S6319C1C1Ev();
extern void _ZN7S6319C1D1Ev();
Name_Map name_map_S6319C1[] = {
  NSPAIR(_ZN7S6319C1C1Ev),
  NSPAIR(_ZN7S6319C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_S10103C88;
extern VTBL_ENTRY _ZTI9S10103C88[];
static Base_Class bases_S6319C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S10103C88,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7S6319C1[];
extern void _ZN7S6319C1D1Ev();
extern void _ZN7S6319C1D0Ev();
static  VTBL_ENTRY vtc_S6319C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7S6319C1[0]),
  (VTBL_ENTRY)&_ZN7S6319C1D1Ev,
  (VTBL_ENTRY)&_ZN7S6319C1D0Ev,
};
extern VTBL_ENTRY _ZTI7S6319C1[];
extern  VTBL_ENTRY _ZTV7S6319C1[];
Class_Descriptor cd_S6319C1 = {  "S6319C1", // class name
  bases_S6319C1, 1,
  &(vtc_S6319C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7S6319C1),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7S6319C1),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

struct  S18039C2  {
  void *s18039c2f0[3];
  unsigned char s18039c2f1:1;
  void  mf18039c2(); // _ZN8S18039C29mf18039c2Ev
};
//SIG(-1 S18039C2) C1{ m Fp[3] Fc:1}


void  S18039C2 ::mf18039c2(){}

static void Test_S18039C2()
{
  {
    init_simple_test("S18039C2");
    static S18039C2 lv;
    check2(sizeof(lv), ABISELECT(32,16), "sizeof(S18039C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18039C2)");
    check_field_offset(lv, s18039c2f0, 0, "S18039C2.s18039c2f0");
    set_bf_and_test(lv, s18039c2f1, ABISELECT(24,12), 0, 1, 1, "S18039C2");
  }
}
static Arrange_To_Call_Me vS18039C2(Test_S18039C2, "S18039C2", ABISELECT(32,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S18039C1  {
  void *s18039c1f0[2];
  ::S18039C2 s18039c1f1;
  void  mf18039c1(); // _ZN8S18039C19mf18039c1Ev
};
//SIG(1 S18039C1) C1{ m Fp[2] FC2{ m Fp[3] Fc:1}}


void  S18039C1 ::mf18039c1(){}

static void Test_S18039C1()
{
  {
    init_simple_test("S18039C1");
    static S18039C1 lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(S18039C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18039C1)");
    check_field_offset(lv, s18039c1f0, 0, "S18039C1.s18039c1f0");
    check_field_offset(lv, s18039c1f1, ABISELECT(16,8), "S18039C1.s18039c1f1");
  }
}
static Arrange_To_Call_Me vS18039C1(Test_S18039C1, "S18039C1", ABISELECT(48,24));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12728C1  {
  int s12728c1f0;
  void *s12728c1f1;
  short s12728c1f2[2];
  ::S11863C4 s12728c1f3;
};
//SIG(1 S12728C1) C1{ Fi Fp Fs[2] FU2{ Fi Fp Fp}}



static void Test_S12728C1()
{
  {
    init_simple_test("S12728C1");
    S12728C1 lv;
    check2(sizeof(lv), ABISELECT(32,16), "sizeof(S12728C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S12728C1)");
    check_field_offset(lv, s12728c1f0, 0, "S12728C1.s12728c1f0");
    check_field_offset(lv, s12728c1f1, ABISELECT(8,4), "S12728C1.s12728c1f1");
    check_field_offset(lv, s12728c1f2, ABISELECT(16,8), "S12728C1.s12728c1f2");
    check_field_offset(lv, s12728c1f3, ABISELECT(24,12), "S12728C1.s12728c1f3");
  }
}
static Arrange_To_Call_Me vS12728C1(Test_S12728C1, "S12728C1", ABISELECT(32,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15910C1  {
  ::S2519C3 s15910c1f0;
  int s15910c1f1;
  void  mf15910c1(); // _ZN8S15910C19mf15910c1Ev
};
//SIG(1 S15910C1) C1{ m FC2{ m Fi Fc Fl FL Fp} Fi}


void  S15910C1 ::mf15910c1(){}

static void Test_S15910C1()
{
  {
    init_simple_test("S15910C1");
    S15910C1 lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S15910C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15910C1)");
    check_field_offset(lv, s15910c1f0, 0, "S15910C1.s15910c1f0");
    check_field_offset(lv, s15910c1f1, ABISELECT(32,24), "S15910C1.s15910c1f1");
  }
}
static Arrange_To_Call_Me vS15910C1(Test_S15910C1, "S15910C1", ABISELECT(40,28));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15974C1  {
  ::S5742C3_nt s15974c1f0[16];
  void *s15974c1f1;
  void  mf15974c1(); // _ZN8S15974C19mf15974c1Ev
};
//SIG(1 S15974C1) C1{ m FC2{ m Fi[2] Fp}[16] Fp}


void  S15974C1 ::mf15974c1(){}

static void Test_S15974C1()
{
  {
    init_simple_test("S15974C1");
    S15974C1 lv;
    check2(sizeof(lv), ABISELECT(264,196), "sizeof(S15974C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15974C1)");
    check_field_offset(lv, s15974c1f0, 0, "S15974C1.s15974c1f0");
    check_field_offset(lv, s15974c1f1, ABISELECT(256,192), "S15974C1.s15974c1f1");
  }
}
static Arrange_To_Call_Me vS15974C1(Test_S15974C1, "S15974C1", ABISELECT(264,196));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13719C2_nt  {
  long s13719c2f0;
};
//SIG(-1 S13719C2_nt) C1{ Fl}



//skip512 S13719C2_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13719C3  {
  char s13719c3f0;
  long s13719c3f1[2];
};
//SIG(-1 S13719C3) C1{ Fc Fl[2]}



static void Test_S13719C3()
{
  {
    init_simple_test("S13719C3");
    S13719C3 lv;
    check2(sizeof(lv), ABISELECT(24,12), "sizeof(S13719C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13719C3)");
    check_field_offset(lv, s13719c3f0, 0, "S13719C3.s13719c3f0");
    check_field_offset(lv, s13719c3f1, ABISELECT(8,4), "S13719C3.s13719c3f1");
  }
}
static Arrange_To_Call_Me vS13719C3(Test_S13719C3, "S13719C3", ABISELECT(24,12));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13719C1  {
  long s13719c1f0;
  ::S13719C2_nt s13719c1f1;
  ::S13719C3 s13719c1f2;
};
//SIG(1 S13719C1) C1{ Fl FC2{ Fl} FC3{ Fc Fl[2]}}



static void Test_S13719C1()
{
  {
    init_simple_test("S13719C1");
    S13719C1 lv;
    check2(sizeof(lv), ABISELECT(40,20), "sizeof(S13719C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13719C1)");
    check_field_offset(lv, s13719c1f0, 0, "S13719C1.s13719c1f0");
    check_field_offset(lv, s13719c1f1, ABISELECT(8,4), "S13719C1.s13719c1f1");
    check_field_offset(lv, s13719c1f2, ABISELECT(16,8), "S13719C1.s13719c1f2");
  }
}
static Arrange_To_Call_Me vS13719C1(Test_S13719C1, "S13719C1", ABISELECT(40,20));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S18964C1  {
  virtual  ~S18964C1(); // _ZN8S18964C1D1Ev
  virtual void  v1(); // _ZN8S18964C12v1Ev
  virtual void  v2(); // _ZN8S18964C12v2Ev
  virtual void  v3(); // _ZN8S18964C12v3Ev
  virtual void  v4(); // _ZN8S18964C12v4Ev
  virtual void  v5(); // _ZN8S18964C12v5Ev
  virtual void  v6(); // _ZN8S18964C12v6Ev
  virtual void  v7(); // _ZN8S18964C12v7Ev
  S18964C1(); // tgen
};
//SIG(1 S18964C1) C1{ vd v1 v2 v3 v4 v5 v6 v7}


 S18964C1 ::~S18964C1(){ note_dtor("S18964C1", this);}
void  S18964C1 ::v1(){vfunc_called(this, "_ZN8S18964C12v1Ev");}
void  S18964C1 ::v2(){vfunc_called(this, "_ZN8S18964C12v2Ev");}
void  S18964C1 ::v3(){vfunc_called(this, "_ZN8S18964C12v3Ev");}
void  S18964C1 ::v4(){vfunc_called(this, "_ZN8S18964C12v4Ev");}
void  S18964C1 ::v5(){vfunc_called(this, "_ZN8S18964C12v5Ev");}
void  S18964C1 ::v6(){vfunc_called(this, "_ZN8S18964C12v6Ev");}
void  S18964C1 ::v7(){vfunc_called(this, "_ZN8S18964C12v7Ev");}
S18964C1 ::S18964C1(){ note_ctor("S18964C1", this);} // tgen

static void Test_S18964C1()
{
  extern Class_Descriptor cd_S18964C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S18964C1, buf);
    S18964C1 *dp, &lv = *(dp=new (buf) S18964C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S18964C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18964C1)");
    test_class_info(&lv, &cd_S18964C1);
    dp->~S18964C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS18964C1(Test_S18964C1, "S18964C1", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S18964C1C1Ev();
extern void _ZN8S18964C1D1Ev();
Name_Map name_map_S18964C1[] = {
  NSPAIR(_ZN8S18964C1C1Ev),
  NSPAIR(_ZN8S18964C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S18964C1[];
extern void _ZN8S18964C1D1Ev();
extern void _ZN8S18964C1D0Ev();
extern void _ZN8S18964C12v1Ev();
extern void _ZN8S18964C12v2Ev();
extern void _ZN8S18964C12v3Ev();
extern void _ZN8S18964C12v4Ev();
extern void _ZN8S18964C12v5Ev();
extern void _ZN8S18964C12v6Ev();
extern void _ZN8S18964C12v7Ev();
static  VTBL_ENTRY vtc_S18964C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S18964C1[0]),
  (VTBL_ENTRY)&_ZN8S18964C1D1Ev,
  (VTBL_ENTRY)&_ZN8S18964C1D0Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v1Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v2Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v3Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v4Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v5Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v6Ev,
  (VTBL_ENTRY)&_ZN8S18964C12v7Ev,
};
extern VTBL_ENTRY _ZTI8S18964C1[];
extern  VTBL_ENTRY _ZTV8S18964C1[];
Class_Descriptor cd_S18964C1 = {  "S18964C1", // class name
  0,0,//no base classes
  &(vtc_S18964C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S18964C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S18964C1),11, //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

struct  S5732C1  : S2519C3 {
  int s5732c1f0;
};
//SIG(1 S5732C1) C1{ BC2{ m Fi Fc Fl FL Fp} Fi}



static void Test_S5732C1()
{
  extern Class_Descriptor cd_S5732C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_S5732C1, buf);
    S5732C1 &lv = *(new (buf) S5732C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(S5732C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5732C1)");
    check_base_class_offset(lv, (S2519C3*), 0, "S5732C1");
    check_field_offset(lv, s5732c1f0, ABISELECT(32,24), "S5732C1.s5732c1f0");
    test_class_info(&lv, &cd_S5732C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5732C1(Test_S5732C1, "S5732C1", ABISELECT(40,28));

#else // __cplusplus

extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S5732C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5732C1 = {  "S5732C1", // class name
  bases_S5732C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(40,28), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11569C2_nt  {
  int s11569c2f0[2];
};
//SIG(-1 S11569C2_nt) C1{ Fi[2]}



//skip512 S11569C2_nt

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11569C1  {
  ::S11569C2_nt s11569c1f0;
  ::S11569C2_nt s11569c1f1;
  long s11569c1f2;
  int s11569c1f3[2];
};
//SIG(1 S11569C1) C1{ FC2{ Fi[2]} FC2 Fl Fi[2]}



static void Test_S11569C1()
{
  {
    init_simple_test("S11569C1");
    S11569C1 lv;
    check2(sizeof(lv), ABISELECT(32,28), "sizeof(S11569C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11569C1)");
    check_field_offset(lv, s11569c1f0, 0, "S11569C1.s11569c1f0");
    check_field_offset(lv, s11569c1f1, 8, "S11569C1.s11569c1f1");
    check_field_offset(lv, s11569c1f2, 16, "S11569C1.s11569c1f2");
    check_field_offset(lv, s11569c1f3, ABISELECT(24,20), "S11569C1.s11569c1f3");
  }
}
static Arrange_To_Call_Me vS11569C1(Test_S11569C1, "S11569C1", ABISELECT(32,28));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5734C1  : S2519C3 {
};
//SIG(1 S5734C1) C1{ BC2{ m Fi Fc Fl FL Fp}}



static void Test_S5734C1()
{
  extern Class_Descriptor cd_S5734C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_S5734C1, buf);
    S5734C1 &lv = *(new (buf) S5734C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(S5734C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S5734C1)");
    check_base_class_offset(lv, (S2519C3*), 0, "S5734C1");
    test_class_info(&lv, &cd_S5734C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5734C1(Test_S5734C1, "S5734C1", ABISELECT(32,24));

#else // __cplusplus

extern Class_Descriptor cd_S2519C3;
extern VTBL_ENTRY _ZTI7S2519C3[];
static Base_Class bases_S5734C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2519C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5734C1 = {  "S5734C1", // class name
  bases_S5734C1, 1,
  0, // no vftv
  0, //no vtt
  ABISELECT(32,24), // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10738C1  {
  char s10738c1f0[21];
  int s10738c1f1[2];
  char s10738c1f2[1001];
};
//SIG(1 S10738C1) C1{ Fc[21] Fi[2] Fc[1001]}



static void Test_S10738C1()
{
  {
    init_simple_test("S10738C1");
    S10738C1 lv;
    check2(sizeof(lv), 1036, "sizeof(S10738C1)");
    check2(__alignof__(lv), 4, "__alignof__(S10738C1)");
    check_field_offset(lv, s10738c1f0, 0, "S10738C1.s10738c1f0");
    check_field_offset(lv, s10738c1f1, 24, "S10738C1.s10738c1f1");
    check_field_offset(lv, s10738c1f2, 32, "S10738C1.s10738c1f2");
  }
}
static Arrange_To_Call_Me vS10738C1(Test_S10738C1, "S10738C1", 1036);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16903C1  {
  int s16903c1f0;
  void *s16903c1f1;
  ::S17501C3_nt s16903c1f2;
  void  mf16903c1(); // _ZN8S16903C19mf16903c1Ev
};
//SIG(1 S16903C1) C1{ m Fi Fp FC2{ m Fi[2]}}


void  S16903C1 ::mf16903c1(){}

static void Test_S16903C1()
{
  {
    init_simple_test("S16903C1");
    S16903C1 lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S16903C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S16903C1)");
    check_field_offset(lv, s16903c1f0, 0, "S16903C1.s16903c1f0");
    check_field_offset(lv, s16903c1f1, ABISELECT(8,4), "S16903C1.s16903c1f1");
    check_field_offset(lv, s16903c1f2, ABISELECT(16,8), "S16903C1.s16903c1f2");
  }
}
static Arrange_To_Call_Me vS16903C1(Test_S16903C1, "S16903C1", ABISELECT(24,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S15566C1  {
  ::S14641C3 s15566c1f0;
  int s15566c1f1[2];
  void  mf15566c1(); // _ZN8S15566C19mf15566c1Ev
};
//SIG(1 S15566C1) C1{ m FC2{ Fi[4] Fp} Fi[2]}


void  S15566C1 ::mf15566c1(){}

static void Test_S15566C1()
{
  {
    init_simple_test("S15566C1");
    S15566C1 lv;
    check2(sizeof(lv), ABISELECT(32,28), "sizeof(S15566C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S15566C1)");
    check_field_offset(lv, s15566c1f0, 0, "S15566C1.s15566c1f0");
    check_field_offset(lv, s15566c1f1, ABISELECT(24,20), "S15566C1.s15566c1f1");
  }
}
static Arrange_To_Call_Me vS15566C1(Test_S15566C1, "S15566C1", ABISELECT(32,28));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14456C1  {
  void *s14456c1f0[2];
  char s14456c1f1[4];
  void *s14456c1f2;
  int s14456c1f3[2];
};
//SIG(1 S14456C1) C1{ Fp[2] Fc[4] Fp Fi[2]}



static void Test_S14456C1()
{
  {
    init_simple_test("S14456C1");
    S14456C1 lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(S14456C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14456C1)");
    check_field_offset(lv, s14456c1f0, 0, "S14456C1.s14456c1f0");
    check_field_offset(lv, s14456c1f1, ABISELECT(16,8), "S14456C1.s14456c1f1");
    check_field_offset(lv, s14456c1f2, ABISELECT(24,12), "S14456C1.s14456c1f2");
    check_field_offset(lv, s14456c1f3, ABISELECT(32,16), "S14456C1.s14456c1f3");
  }
}
static Arrange_To_Call_Me vS14456C1(Test_S14456C1, "S14456C1", ABISELECT(40,24));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17720C1  {
  void *s17720c1f0;
  int s17720c1f1;
  ::S10103C88 s17720c1f2;
  int s17720c1f3;
  void *s17720c1f4;
  void  mf17720c1(); // _ZN8S17720C19mf17720c1Ev
};
//SIG(1 S17720C1) C1{ m Fp Fi FC2{ m} Fi Fp}


void  S17720C1 ::mf17720c1(){}

static void Test_S17720C1()
{
  {
    init_simple_test("S17720C1");
    S17720C1 lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(S17720C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17720C1)");
    check_field_offset(lv, s17720c1f0, 0, "S17720C1.s17720c1f0");
    check_field_offset(lv, s17720c1f1, ABISELECT(8,4), "S17720C1.s17720c1f1");
    check_field_offset(lv, s17720c1f2, ABISELECT(12,8), "S17720C1.s17720c1f2");
    check_field_offset(lv, s17720c1f3, ABISELECT(16,12), "S17720C1.s17720c1f3");
    check_field_offset(lv, s17720c1f4, ABISELECT(24,16), "S17720C1.s17720c1f4");
  }
}
static Arrange_To_Call_Me vS17720C1(Test_S17720C1, "S17720C1", ABISELECT(32,20));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12935C1  {
  int s12935c1f0:4;
  int s12935c1f1:4;
  int s12935c1f2:4;
  int s12935c1f3:4;
};
//SIG(1 S12935C1) C1{ Fi:4 Fi:4 Fi:4 Fi:4}



static void Test_S12935C1()
{
  {
    init_simple_test("S12935C1");
    static S12935C1 lv;
    check2(sizeof(lv), 4, "sizeof(S12935C1)");
    check2(__alignof__(lv), 4, "__alignof__(S12935C1)");
    set_bf_and_test(lv, s12935c1f0, 0, 0, 4, 1, "S12935C1");
    set_bf_and_test(lv, s12935c1f0, 0, 0, 4, hide_sll(1LL<<3), "S12935C1");
    set_bf_and_test(lv, s12935c1f1, 0, 4, 4, 1, "S12935C1");
    set_bf_and_test(lv, s12935c1f1, 0, 4, 4, hide_sll(1LL<<3), "S12935C1");
    set_bf_and_test(lv, s12935c1f2, 1, 0, 4, 1, "S12935C1");
    set_bf_and_test(lv, s12935c1f2, 1, 0, 4, hide_sll(1LL<<3), "S12935C1");
    set_bf_and_test(lv, s12935c1f3, 1, 4, 4, 1, "S12935C1");
    set_bf_and_test(lv, s12935c1f3, 1, 4, 4, hide_sll(1LL<<3), "S12935C1");
  }
}
static Arrange_To_Call_Me vS12935C1(Test_S12935C1, "S12935C1", 4);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10598C1  {
  char s10598c1f0[13];
  void *s10598c1f1;
  int s10598c1f2[2];
  char s10598c1f3;
};
//SIG(1 S10598C1) C1{ Fc[13] Fp Fi[2] Fc}



static void Test_S10598C1()
{
  {
    init_simple_test("S10598C1");
    S10598C1 lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(S10598C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10598C1)");
    check_field_offset(lv, s10598c1f0, 0, "S10598C1.s10598c1f0");
    check_field_offset(lv, s10598c1f1, 16, "S10598C1.s10598c1f1");
    check_field_offset(lv, s10598c1f2, ABISELECT(24,20), "S10598C1.s10598c1f2");
    check_field_offset(lv, s10598c1f3, ABISELECT(32,28), "S10598C1.s10598c1f3");
  }
}
static Arrange_To_Call_Me vS10598C1(Test_S10598C1, "S10598C1", ABISELECT(40,32));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12571C1  {
  int s12571c1f0;
  ::S1142C5_nt s12571c1f1;
  ::S1142C5_nt s12571c1f2;
};
//SIG(1 S12571C1) C1{ Fi FC2{ m Fi[3]} FC2}



static void Test_S12571C1()
{
  {
    init_simple_test("S12571C1");
    S12571C1 lv;
    check2(sizeof(lv), 28, "sizeof(S12571C1)");
    check2(__alignof__(lv), 4, "__alignof__(S12571C1)");
    check_field_offset(lv, s12571c1f0, 0, "S12571C1.s12571c1f0");
    check_field_offset(lv, s12571c1f1, 4, "S12571C1.s12571c1f1");
    check_field_offset(lv, s12571c1f2, 16, "S12571C1.s12571c1f2");
  }
}
static Arrange_To_Call_Me vS12571C1(Test_S12571C1, "S12571C1", 28);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S18916C1  {
  virtual  ~S18916C1(); // _ZN8S18916C1D1Ev
  virtual void  v1(); // _ZN8S18916C12v1Ev
  virtual void  v2(); // _ZN8S18916C12v2Ev
  virtual void  v3(); // _ZN8S18916C12v3Ev
  virtual void  v4(); // _ZN8S18916C12v4Ev
  virtual void  v5(); // _ZN8S18916C12v5Ev
  S18916C1(); // tgen
};
//SIG(1 S18916C1) C1{ vd v1 v2 v3 v4 v5}


 S18916C1 ::~S18916C1(){ note_dtor("S18916C1", this);}
void  S18916C1 ::v1(){vfunc_called(this, "_ZN8S18916C12v1Ev");}
void  S18916C1 ::v2(){vfunc_called(this, "_ZN8S18916C12v2Ev");}
void  S18916C1 ::v3(){vfunc_called(this, "_ZN8S18916C12v3Ev");}
void  S18916C1 ::v4(){vfunc_called(this, "_ZN8S18916C12v4Ev");}
void  S18916C1 ::v5(){vfunc_called(this, "_ZN8S18916C12v5Ev");}
S18916C1 ::S18916C1(){ note_ctor("S18916C1", this);} // tgen

static void Test_S18916C1()
{
  extern Class_Descriptor cd_S18916C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd_S18916C1, buf);
    S18916C1 *dp, &lv = *(dp=new (buf) S18916C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(S18916C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18916C1)");
    test_class_info(&lv, &cd_S18916C1);
    dp->~S18916C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS18916C1(Test_S18916C1, "S18916C1", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN8S18916C1C1Ev();
extern void _ZN8S18916C1D1Ev();
Name_Map name_map_S18916C1[] = {
  NSPAIR(_ZN8S18916C1C1Ev),
  NSPAIR(_ZN8S18916C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S18916C1[];
extern void _ZN8S18916C1D1Ev();
extern void _ZN8S18916C1D0Ev();
extern void _ZN8S18916C12v1Ev();
extern void _ZN8S18916C12v2Ev();
extern void _ZN8S18916C12v3Ev();
extern void _ZN8S18916C12v4Ev();
extern void _ZN8S18916C12v5Ev();
static  VTBL_ENTRY vtc_S18916C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S18916C1[0]),
  (VTBL_ENTRY)&_ZN8S18916C1D1Ev,
  (VTBL_ENTRY)&_ZN8S18916C1D0Ev,
  (VTBL_ENTRY)&_ZN8S18916C12v1Ev,
  (VTBL_ENTRY)&_ZN8S18916C12v2Ev,
  (VTBL_ENTRY)&_ZN8S18916C12v3Ev,
  (VTBL_ENTRY)&_ZN8S18916C12v4Ev,
  (VTBL_ENTRY)&_ZN8S18916C12v5Ev,
};
extern VTBL_ENTRY _ZTI8S18916C1[];
extern  VTBL_ENTRY _ZTV8S18916C1[];
Class_Descriptor cd_S18916C1 = {  "S18916C1", // class name
  0,0,//no base classes
  &(vtc_S18916C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTI8S18916C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S18916C1),9, //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

struct  S18605C1  {
  char s18605c1f0;
  int s18605c1f1[2];
  virtual void  v1(); // _ZN8S18605C12v1Ev
  virtual void  v2(); // _ZN8S18605C12v2Ev
  virtual void  v3(); // _ZN8S18605C12v3Ev
  ~S18605C1(); // tgen
  S18605C1(); // tgen
};
//SIG(1 S18605C1) C1{ v1 v2 v3 Fc Fi[2]}


void  S18605C1 ::v1(){vfunc_called(this, "_ZN8S18605C12v1Ev");}
void  S18605C1 ::v2(){vfunc_called(this, "_ZN8S18605C12v2Ev");}
void  S18605C1 ::v3(){vfunc_called(this, "_ZN8S18605C12v3Ev");}
S18605C1 ::~S18605C1(){ note_dtor("S18605C1", this);} // tgen
S18605C1 ::S18605C1(){ note_ctor("S18605C1", this);} // tgen

static void Test_S18605C1()
{
  extern Class_Descriptor cd_S18605C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_S18605C1, buf);
    S18605C1 *dp, &lv = *(dp=new (buf) S18605C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S18605C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18605C1)");
    check_field_offset(lv, s18605c1f0, ABISELECT(8,4), "S18605C1.s18605c1f0");
    check_field_offset(lv, s18605c1f1, ABISELECT(12,8), "S18605C1.s18605c1f1");
    test_class_info(&lv, &cd_S18605C1);
    dp->~S18605C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS18605C1(Test_S18605C1, "S18605C1", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN8S18605C1C1Ev();
extern void _ZN8S18605C1D1Ev();
Name_Map name_map_S18605C1[] = {
  NSPAIR(_ZN8S18605C1C1Ev),
  NSPAIR(_ZN8S18605C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S18605C1[];
extern void _ZN8S18605C12v1Ev();
extern void _ZN8S18605C12v2Ev();
extern void _ZN8S18605C12v3Ev();
static  VTBL_ENTRY vtc_S18605C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S18605C1[0]),
  (VTBL_ENTRY)&_ZN8S18605C12v1Ev,
  (VTBL_ENTRY)&_ZN8S18605C12v2Ev,
  (VTBL_ENTRY)&_ZN8S18605C12v3Ev,
};
extern VTBL_ENTRY _ZTI8S18605C1[];
extern  VTBL_ENTRY _ZTV8S18605C1[];
Class_Descriptor cd_S18605C1 = {  "S18605C1", // class name
  0,0,//no base classes
  &(vtc_S18605C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI8S18605C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S18605C1),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14522C1  {
  void *s14522c1f0[2];
  int s14522c1f1;
  void *s14522c1f2[4];
  int s14522c1f3;
};
//SIG(1 S14522C1) C1{ Fp[2] Fi Fp[4] Fi}



static void Test_S14522C1()
{
  {
    init_simple_test("S14522C1");
    S14522C1 lv;
    check2(sizeof(lv), ABISELECT(64,32), "sizeof(S14522C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14522C1)");
    check_field_offset(lv, s14522c1f0, 0, "S14522C1.s14522c1f0");
    check_field_offset(lv, s14522c1f1, ABISELECT(16,8), "S14522C1.s14522c1f1");
    check_field_offset(lv, s14522c1f2, ABISELECT(24,12), "S14522C1.s14522c1f2");
    check_field_offset(lv, s14522c1f3, ABISELECT(56,28), "S14522C1.s14522c1f3");
  }
}
static Arrange_To_Call_Me vS14522C1(Test_S14522C1, "S14522C1", ABISELECT(64,32));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13092C1  {
  int s13092c1f0[2];
  ::S11569C2_nt s13092c1f1;
};
//SIG(1 S13092C1) C1{ Fi[2] FC2{ Fi[2]}}



static void Test_S13092C1()
{
  {
    init_simple_test("S13092C1");
    S13092C1 lv;
    check2(sizeof(lv), 16, "sizeof(S13092C1)");
    check2(__alignof__(lv), 4, "__alignof__(S13092C1)");
    check_field_offset(lv, s13092c1f0, 0, "S13092C1.s13092c1f0");
    check_field_offset(lv, s13092c1f1, 8, "S13092C1.s13092c1f1");
  }
}
static Arrange_To_Call_Me vS13092C1(Test_S13092C1, "S13092C1", 16);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11507C1  {
  ::S10103C18 s11507c1f0;
  void *s11507c1f1;
  int s11507c1f2;
};
//SIG(1 S11507C1) C1{ FC2{ Fi[11]} Fp Fi}



static void Test_S11507C1()
{
  {
    init_simple_test("S11507C1");
    S11507C1 lv;
    check2(sizeof(lv), ABISELECT(64,52), "sizeof(S11507C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S11507C1)");
    check_field_offset(lv, s11507c1f0, 0, "S11507C1.s11507c1f0");
    check_field_offset(lv, s11507c1f1, ABISELECT(48,44), "S11507C1.s11507c1f1");
    check_field_offset(lv, s11507c1f2, ABISELECT(56,48), "S11507C1.s11507c1f2");
  }
}
static Arrange_To_Call_Me vS11507C1(Test_S11507C1, "S11507C1", ABISELECT(64,52));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S18937C1  {
  char s18937c1f0:2;
  void *s18937c1f1[2];
  virtual  ~S18937C1(); // _ZN8S18937C1D1Ev
  virtual void  v1(); // _ZN8S18937C12v1Ev
  S18937C1(); // tgen
};
//SIG(1 S18937C1) C1{ vd v1 Fc:2 Fp[2]}


 S18937C1 ::~S18937C1(){ note_dtor("S18937C1", this);}
void  S18937C1 ::v1(){vfunc_called(this, "_ZN8S18937C12v1Ev");}
S18937C1 ::S18937C1(){ note_ctor("S18937C1", this);} // tgen

static void Test_S18937C1()
{
  extern Class_Descriptor cd_S18937C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[5];
    init_test(&cd_S18937C1, buf);
    S18937C1 *dp, &lv = *(dp=new (buf) S18937C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,16), "sizeof(S18937C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S18937C1)");
    set_bf_and_test(lv, s18937c1f0, ABISELECT(8,4), 0, 2, 1, "S18937C1");
    set_bf_and_test(lv, s18937c1f0, ABISELECT(8,4), 0, 2, hide_sll(1LL<<1), "S18937C1");
    check_field_offset(lv, s18937c1f1, ABISELECT(16,8), "S18937C1.s18937c1f1");
    test_class_info(&lv, &cd_S18937C1);
    dp->~S18937C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS18937C1(Test_S18937C1, "S18937C1", ABISELECT(32,16));

#else // __cplusplus

extern void _ZN8S18937C1C1Ev();
extern void _ZN8S18937C1D1Ev();
Name_Map name_map_S18937C1[] = {
  NSPAIR(_ZN8S18937C1C1Ev),
  NSPAIR(_ZN8S18937C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S18937C1[];
extern void _ZN8S18937C1D1Ev();
extern void _ZN8S18937C1D0Ev();
extern void _ZN8S18937C12v1Ev();
static  VTBL_ENTRY vtc_S18937C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S18937C1[0]),
  (VTBL_ENTRY)&_ZN8S18937C1D1Ev,
  (VTBL_ENTRY)&_ZN8S18937C1D0Ev,
  (VTBL_ENTRY)&_ZN8S18937C12v1Ev,
};
extern VTBL_ENTRY _ZTI8S18937C1[];
extern  VTBL_ENTRY _ZTV8S18937C1[];
Class_Descriptor cd_S18937C1 = {  "S18937C1", // class name
  0,0,//no base classes
  &(vtc_S18937C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,16), // object size
  NSPAIRA(_ZTI8S18937C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S18937C1),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10678C1  {
  char s10678c1f0[2];
  short s10678c1f1;
  char s10678c1f2[16];
};
//SIG(1 S10678C1) C1{ Fc[2] Fs Fc[16]}



static void Test_S10678C1()
{
  {
    init_simple_test("S10678C1");
    S10678C1 lv;
    check2(sizeof(lv), 20, "sizeof(S10678C1)");
    check2(__alignof__(lv), 2, "__alignof__(S10678C1)");
    check_field_offset(lv, s10678c1f0, 0, "S10678C1.s10678c1f0");
    check_field_offset(lv, s10678c1f1, 2, "S10678C1.s10678c1f1");
    check_field_offset(lv, s10678c1f2, 4, "S10678C1.s10678c1f2");
  }
}
static Arrange_To_Call_Me vS10678C1(Test_S10678C1, "S10678C1", 20);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14339C1  {
  void *s14339c1f0;
  int s14339c1f1[3];
  void *s14339c1f2;
  int s14339c1f3;
};
//SIG(1 S14339C1) C1{ Fp Fi[3] Fp Fi}



static void Test_S14339C1()
{
  {
    init_simple_test("S14339C1");
    S14339C1 lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(S14339C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14339C1)");
    check_field_offset(lv, s14339c1f0, 0, "S14339C1.s14339c1f0");
    check_field_offset(lv, s14339c1f1, ABISELECT(8,4), "S14339C1.s14339c1f1");
    check_field_offset(lv, s14339c1f2, ABISELECT(24,16), "S14339C1.s14339c1f2");
    check_field_offset(lv, s14339c1f3, ABISELECT(32,20), "S14339C1.s14339c1f3");
  }
}
static Arrange_To_Call_Me vS14339C1(Test_S14339C1, "S14339C1", ABISELECT(40,24));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S5878C1  : S2718C3_nt {
  int s5878c1f0[3];
};
//SIG(1 S5878C1) C1{ BC2{ m Fi} Fi[3]}



static void Test_S5878C1()
{
  extern Class_Descriptor cd_S5878C1;
  void *lvp;
  {
    int buf[5];
    init_test(&cd_S5878C1, buf);
    S5878C1 &lv = *(new (buf) S5878C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), 16, "sizeof(S5878C1)");
    check2(__alignof__(lv), 4, "__alignof__(S5878C1)");
    check_base_class_offset(lv, (S2718C3_nt*), 0, "S5878C1");
    check_field_offset(lv, s5878c1f0, 4, "S5878C1.s5878c1f0");
    test_class_info(&lv, &cd_S5878C1);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS5878C1(Test_S5878C1, "S5878C1", 16);

#else // __cplusplus

extern Class_Descriptor cd_S2718C3_nt;
static Base_Class bases_S5878C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_S2718C3_nt,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_S5878C1 = {  "S5878C1", // class name
  bases_S5878C1, 1,
  0, // no vftv
  0, //no vtt
  16, // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14232C1  {
  void *s14232c1f0;
  int s14232c1f1;
  void *s14232c1f2;
  int s14232c1f3[3];
};
//SIG(1 S14232C1) C1{ Fp Fi Fp Fi[3]}



static void Test_S14232C1()
{
  {
    init_simple_test("S14232C1");
    S14232C1 lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(S14232C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14232C1)");
    check_field_offset(lv, s14232c1f0, 0, "S14232C1.s14232c1f0");
    check_field_offset(lv, s14232c1f1, ABISELECT(8,4), "S14232C1.s14232c1f1");
    check_field_offset(lv, s14232c1f2, ABISELECT(16,8), "S14232C1.s14232c1f2");
    check_field_offset(lv, s14232c1f3, ABISELECT(24,12), "S14232C1.s14232c1f3");
  }
}
static Arrange_To_Call_Me vS14232C1(Test_S14232C1, "S14232C1", ABISELECT(40,24));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10719C1  {
  char s10719c1f0[205];
  int s10719c1f1[3];
};
//SIG(1 S10719C1) C1{ Fc[205] Fi[3]}



static void Test_S10719C1()
{
  {
    init_simple_test("S10719C1");
    S10719C1 lv;
    check2(sizeof(lv), 220, "sizeof(S10719C1)");
    check2(__alignof__(lv), 4, "__alignof__(S10719C1)");
    check_field_offset(lv, s10719c1f0, 0, "S10719C1.s10719c1f0");
    check_field_offset(lv, s10719c1f1, 208, "S10719C1.s10719c1f1");
  }
}
static Arrange_To_Call_Me vS10719C1(Test_S10719C1, "S10719C1", 220);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13324C1  {
  int s13324c1f0[3];
  char s13324c1f1[768];
};
//SIG(1 S13324C1) C1{ Fi[3] Fc[768]}



static void Test_S13324C1()
{
  {
    init_simple_test("S13324C1");
    S13324C1 lv;
    check2(sizeof(lv), 780, "sizeof(S13324C1)");
    check2(__alignof__(lv), 4, "__alignof__(S13324C1)");
    check_field_offset(lv, s13324c1f0, 0, "S13324C1.s13324c1f0");
    check_field_offset(lv, s13324c1f1, 12, "S13324C1.s13324c1f1");
  }
}
static Arrange_To_Call_Me vS13324C1(Test_S13324C1, "S13324C1", 780);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13296C1  {
  int s13296c1f0[3];
  char s13296c1f1[12];
};
//SIG(1 S13296C1) C1{ Fi[3] Fc[12]}



static void Test_S13296C1()
{
  {
    init_simple_test("S13296C1");
    S13296C1 lv;
    check2(sizeof(lv), 24, "sizeof(S13296C1)");
    check2(__alignof__(lv), 4, "__alignof__(S13296C1)");
    check_field_offset(lv, s13296c1f0, 0, "S13296C1.s13296c1f0");
    check_field_offset(lv, s13296c1f1, 12, "S13296C1.s13296c1f1");
  }
}
static Arrange_To_Call_Me vS13296C1(Test_S13296C1, "S13296C1", 24);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S16574C1  {
  int s16574c1f0;
  char  :0;
  void *s16574c1f2;
  void  mf16574c1(); // _ZN8S16574C19mf16574c1Ev
};
//SIG(1 S16574C1) C1{ m Fi Fc:0 Fp}


void  S16574C1 ::mf16574c1(){}

static void Test_S16574C1()
{
  {
    init_simple_test("S16574C1");
    static S16574C1 lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(S16574C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S16574C1)");
    check_field_offset(lv, s16574c1f0, 0, "S16574C1.s16574c1f0");
    check_field_offset(lv, s16574c1f2, ABISELECT(8,4), "S16574C1.s16574c1f2");
  }
}
static Arrange_To_Call_Me vS16574C1(Test_S16574C1, "S16574C1", ABISELECT(16,8));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S12107C1  {
  ::S2718C3_nt s12107c1f0;
  char s12107c1f1;
};
//SIG(1 S12107C1) C1{ FC2{ m Fi} Fc}



static void Test_S12107C1()
{
  {
    init_simple_test("S12107C1");
    S12107C1 lv;
    check2(sizeof(lv), 8, "sizeof(S12107C1)");
    check2(__alignof__(lv), 4, "__alignof__(S12107C1)");
    check_field_offset(lv, s12107c1f0, 0, "S12107C1.s12107c1f0");
    check_field_offset(lv, s12107c1f1, 4, "S12107C1.s12107c1f1");
  }
}
static Arrange_To_Call_Me vS12107C1(Test_S12107C1, "S12107C1", 8);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10471C1  {
  char s10471c1f0;
  int s10471c1f1[2];
  long s10471c1f2;
};
//SIG(1 S10471C1) C1{ Fc Fi[2] Fl}



static void Test_S10471C1()
{
  {
    init_simple_test("S10471C1");
    S10471C1 lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(S10471C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S10471C1)");
    check_field_offset(lv, s10471c1f0, 0, "S10471C1.s10471c1f0");
    check_field_offset(lv, s10471c1f1, 4, "S10471C1.s10471c1f1");
    check_field_offset(lv, s10471c1f2, ABISELECT(16,12), "S10471C1.s10471c1f2");
  }
}
static Arrange_To_Call_Me vS10471C1(Test_S10471C1, "S10471C1", ABISELECT(24,16));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S21883C1  {
  char s21883c1f0;
  void *s21883c1f1;
  virtual  ~S21883C1(); // _ZN8S21883C1D1Ev
  virtual void  v1(); // _ZN8S21883C12v1Ev
  S21883C1(); // tgen
};
//SIG(1 S21883C1) C1{ vd v1 Fc Fp}


 S21883C1 ::~S21883C1(){ note_dtor("S21883C1", this);}
void  S21883C1 ::v1(){vfunc_called(this, "_ZN8S21883C12v1Ev");}
S21883C1 ::S21883C1(){ note_ctor("S21883C1", this);} // tgen

static void Test_S21883C1()
{
  extern Class_Descriptor cd_S21883C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[4];
    init_test(&cd_S21883C1, buf);
    S21883C1 *dp, &lv = *(dp=new (buf) S21883C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,12), "sizeof(S21883C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S21883C1)");
    check_field_offset(lv, s21883c1f0, ABISELECT(8,4), "S21883C1.s21883c1f0");
    check_field_offset(lv, s21883c1f1, ABISELECT(16,8), "S21883C1.s21883c1f1");
    test_class_info(&lv, &cd_S21883C1);
    dp->~S21883C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vS21883C1(Test_S21883C1, "S21883C1", ABISELECT(24,12));

#else // __cplusplus

extern void _ZN8S21883C1C1Ev();
extern void _ZN8S21883C1D1Ev();
Name_Map name_map_S21883C1[] = {
  NSPAIR(_ZN8S21883C1C1Ev),
  NSPAIR(_ZN8S21883C1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI8S21883C1[];
extern void _ZN8S21883C1D1Ev();
extern void _ZN8S21883C1D0Ev();
extern void _ZN8S21883C12v1Ev();
static  VTBL_ENTRY vtc_S21883C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8S21883C1[0]),
  (VTBL_ENTRY)&_ZN8S21883C1D1Ev,
  (VTBL_ENTRY)&_ZN8S21883C1D0Ev,
  (VTBL_ENTRY)&_ZN8S21883C12v1Ev,
};
extern VTBL_ENTRY _ZTI8S21883C1[];
extern  VTBL_ENTRY _ZTV8S21883C1[];
Class_Descriptor cd_S21883C1 = {  "S21883C1", // class name
  0,0,//no base classes
  &(vtc_S21883C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,12), // object size
  NSPAIRA(_ZTI8S21883C1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV8S21883C1),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S17305C1  {
  int s17305c1f0[9];
  void *s17305c1f1;
  void  mf17305c1(); // _ZN8S17305C19mf17305c1Ev
};
//SIG(1 S17305C1) C1{ m Fi[9] Fp}


void  S17305C1 ::mf17305c1(){}

static void Test_S17305C1()
{
  {
    init_simple_test("S17305C1");
    S17305C1 lv;
    check2(sizeof(lv), ABISELECT(48,40), "sizeof(S17305C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S17305C1)");
    check_field_offset(lv, s17305c1f0, 0, "S17305C1.s17305c1f0");
    check_field_offset(lv, s17305c1f1, ABISELECT(40,36), "S17305C1.s17305c1f1");
  }
}
static Arrange_To_Call_Me vS17305C1(Test_S17305C1, "S17305C1", ABISELECT(48,40));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S10544C1  {
  char s10544c1f0:5;
  char s10544c1f1:3;
};
//SIG(1 S10544C1) C1{ Fc:5 Fc:3}



static void Test_S10544C1()
{
  {
    init_simple_test("S10544C1");
    static S10544C1 lv;
    check2(sizeof(lv), 1, "sizeof(S10544C1)");
    check2(__alignof__(lv), 1, "__alignof__(S10544C1)");
    set_bf_and_test(lv, s10544c1f0, 0, 0, 5, 1, "S10544C1");
    set_bf_and_test(lv, s10544c1f0, 0, 0, 5, hide_sll(1LL<<4), "S10544C1");
    set_bf_and_test(lv, s10544c1f1, 0, 5, 3, 1, "S10544C1");
    set_bf_and_test(lv, s10544c1f1, 0, 5, 3, hide_sll(1LL<<2), "S10544C1");
  }
}
static Arrange_To_Call_Me vS10544C1(Test_S10544C1, "S10544C1", 1);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S14563C1  {
  void *s14563c1f0[2];
  long s14563c1f1;
};
//SIG(1 S14563C1) C1{ Fp[2] Fl}



static void Test_S14563C1()
{
  {
    init_simple_test("S14563C1");
    S14563C1 lv;
    check2(sizeof(lv), ABISELECT(24,12), "sizeof(S14563C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S14563C1)");
    check_field_offset(lv, s14563c1f0, 0, "S14563C1.s14563c1f0");
    check_field_offset(lv, s14563c1f1, ABISELECT(16,8), "S14563C1.s14563c1f1");
  }
}
static Arrange_To_Call_Me vS14563C1(Test_S14563C1, "S14563C1", ABISELECT(24,12));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S11034C1  {
  char s11034c1f0[929];
};
//SIG(1 S11034C1) C1{ Fc[929]}



static void Test_S11034C1()
{
  {
    init_simple_test("S11034C1");
    S11034C1 lv;
    check2(sizeof(lv), 929, "sizeof(S11034C1)");
    check2(__alignof__(lv), 1, "__alignof__(S11034C1)");
    check_field_offset(lv, s11034c1f0, 0, "S11034C1.s11034c1f0");
  }
}
static Arrange_To_Call_Me vS11034C1(Test_S11034C1, "S11034C1", 929);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  S13903C1  {
  long s13903c1f0[11];
};
//SIG(1 S13903C1) C1{ Fl[11]}



static void Test_S13903C1()
{
  {
    init_simple_test("S13903C1");
    S13903C1 lv;
    check2(sizeof(lv), ABISELECT(88,44), "sizeof(S13903C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(S13903C1)");
    check_field_offset(lv, s13903c1f0, 0, "S13903C1.s13903c1f0");
  }
}
static Arrange_To_Call_Me vS13903C1(Test_S13903C1, "S13903C1", ABISELECT(88,44));

#else // __cplusplus

#endif // __cplusplus

//============================================================================

