// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: c_compiler -c -o %t1.o -I "common" "common/testsuite.c"
// RUN: cxx_compiler cxx_rtti -c %s -I "common" -o %t2.o
// RUN: c_compiler -c %s -I "common" -o %t3.o
// RUN: linker -o %t2%exeext  %t1.o %t2.o %t3.o
// RUN: runtool %t2%exeext | checker "TEST PASSED"
#include "testsuite.h"
#ifdef __cplusplus

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

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

