ms_class_layout.cpp revision 901dd668931a70932ad09092959c42693409a3cd
12fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// RUN: %clang_cc1 -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -cxx-abi microsoft %s 2>&1 \
22fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// RUN:            | FileCheck %s
32fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
42fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman#pragma pack(push, 8)
52fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
62fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanclass B {
72fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanpublic:
82fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  virtual void b(){}
92fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  int b_field;
102fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanprotected:
112fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanprivate:
122fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
132fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
142fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanclass A : public B {
152fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanpublic:
162fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  int a_field;
172fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  virtual void a(){}
182fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  char one;
192fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanprotected:
202fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanprivate:
212fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
222fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
232fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanclass D {
242fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanpublic:
252fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  virtual void b(){}
262fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  double a;
272fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
282fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
292fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanclass C : public virtual A,
302fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman          public D, public B {
312fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanpublic:
322fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  double c1_field;
332fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  int c2_field;
342fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  double c3_field;
352fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  int c4_field;
362fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  virtual void foo(){}
372fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  virtual void bar(){}
382fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanprotected:
392fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanprivate:
402fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
412fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
422fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanstruct BaseStruct
432fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman{
442fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    BaseStruct(){}
452fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    double v0;
462fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    float v1;
472fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    C fg;
482fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
492fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
502fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanstruct DerivedStruct : public BaseStruct {
512fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  int x;
522fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
532fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
542fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanstruct G
552fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman{
5697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    int g_field;
5797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman};
5897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
5997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedmanstruct H : public G,
6097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman           public virtual D
6197c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman{
622fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman};
632fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
64227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedmanstruct I : public virtual D
65227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman{
66227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  virtual ~I(){}
67227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  double q;
68227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman};
69227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman
709da235244c2de2bcca654b518c66133c30ebde53John McCallstruct K
719da235244c2de2bcca654b518c66133c30ebde53John McCall{
729da235244c2de2bcca654b518c66133c30ebde53John McCall  int k;
739da235244c2de2bcca654b518c66133c30ebde53John McCall};
749da235244c2de2bcca654b518c66133c30ebde53John McCall
759da235244c2de2bcca654b518c66133c30ebde53John McCallstruct L
769da235244c2de2bcca654b518c66133c30ebde53John McCall{
779da235244c2de2bcca654b518c66133c30ebde53John McCall  int l;
789da235244c2de2bcca654b518c66133c30ebde53John McCall};
799da235244c2de2bcca654b518c66133c30ebde53John McCall
809da235244c2de2bcca654b518c66133c30ebde53John McCallstruct M : public virtual K
819da235244c2de2bcca654b518c66133c30ebde53John McCall{
829da235244c2de2bcca654b518c66133c30ebde53John McCall  int m;
839da235244c2de2bcca654b518c66133c30ebde53John McCall};
849da235244c2de2bcca654b518c66133c30ebde53John McCall
859da235244c2de2bcca654b518c66133c30ebde53John McCallstruct N : public L, public M
869da235244c2de2bcca654b518c66133c30ebde53John McCall{
879da235244c2de2bcca654b518c66133c30ebde53John McCall  virtual void f(){}
889da235244c2de2bcca654b518c66133c30ebde53John McCall};
899da235244c2de2bcca654b518c66133c30ebde53John McCall
909da235244c2de2bcca654b518c66133c30ebde53John McCallstruct O : public H, public G {
919da235244c2de2bcca654b518c66133c30ebde53John McCall  virtual void fo(){}
929da235244c2de2bcca654b518c66133c30ebde53John McCall};
939da235244c2de2bcca654b518c66133c30ebde53John McCall
949da235244c2de2bcca654b518c66133c30ebde53John McCallstruct P : public M, public virtual L {
959da235244c2de2bcca654b518c66133c30ebde53John McCall  int p;
969da235244c2de2bcca654b518c66133c30ebde53John McCall};
979da235244c2de2bcca654b518c66133c30ebde53John McCall
98901dd668931a70932ad09092959c42693409a3cdEli Friedmanstruct R {};
999da235244c2de2bcca654b518c66133c30ebde53John McCall
1002fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman#pragma pack(pop)
1012fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1022fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// This needs only for building layouts.
1032fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// Without this clang doesn`t dump record layouts.
1042fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanint main() {
1052fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  // This avoid "Can't yet mangle constructors!" for MS ABI.
1062fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  C* c;
1072fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  c->foo();
1082fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  DerivedStruct* v;
10997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  H* g;
1102fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  BaseStruct* u;
111227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  I* i;
1129da235244c2de2bcca654b518c66133c30ebde53John McCall  N* n;
1139da235244c2de2bcca654b518c66133c30ebde53John McCall  O* o;
1149da235244c2de2bcca654b518c66133c30ebde53John McCall  P* p;
115901dd668931a70932ad09092959c42693409a3cdEli Friedman  R* r;
1162fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  return 0;
1172fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman}
1182fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1192fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK:       0 | class D
120227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  0 |   (D vftable pointer)
1212fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  8 |   double a
1222fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1232fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=16, dsize=16, align=8
1242fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: nvsize=16, nvalign=8
1252fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1269da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %class.D = type { i32 (...)**, double }
1279bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
1282fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK:       0 | class B
129227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  0 |   (B vftable pointer)
1302fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  4 |   int b_field
1312fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1322fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=8, dsize=8, align=4
1332fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: nvsize=8, nvalign=4
1342fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1359da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %class.B = type { i32 (...)**, i32 }
1369bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
1372fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK:       0 | class A
1382fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  0 |   class B (primary base)
139227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  0 |     (B vftable pointer)
1402fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  4 |     int b_field
1412fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  8 |   int a_field
1422fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 12 |   char one
1432fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1442fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=16, dsize=16, align=4
1452fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: nvsize=16, nvalign=4
1462fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1472fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK:       0 | class C
1482fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  0 |   class D (primary base)
149227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  0 |     (D vftable pointer)
1502fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  8 |     double a
1512fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 16 |   class B (base)
152227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 16 |     (B vftable pointer)
1532fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 20 |     int b_field
1542fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 24 |   (C vbtable pointer)
1552fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 32 |   double c1_field
1562fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 40 |   int c2_field
1572fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 48 |   double c3_field
1582fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 56 |   int c4_field
1592fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 64 |   class A (virtual base)
1602fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 64 |     class B (primary base)
161227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 64 |       (B vftable pointer)
1622fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 68 |       int b_field
1632fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 72 |     int a_field
1642fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 76 |     char one
1652fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1662fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=80, dsize=80, align=8
167227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: nvsize=64, nvalign=8
1689bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
1699bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman// CHECK: %class.A = type { %class.B, i32, i8 }
1709bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
1719da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %class.C = type { %class.D, %class.B, i32*, double, i32, double, i32, [4 x i8], %class.A }
1729da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %class.C.base = type { %class.D, %class.B, i32*, double, i32, double, i32 }
1739bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
1742fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK:       0 | struct BaseStruct
1752fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  0 |   double v0
1762fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  8 |   float v1
1772fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 16 |   class C fg
1782fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 16 |     class D (primary base)
179227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 16 |       (D vftable pointer)
1802fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 24 |       double a
1812fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 32 |     class B (base)
182227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 32 |       (B vftable pointer)
1832fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 36 |       int b_field
1842fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 40 |     (C vbtable pointer)
1852fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 48 |     double c1_field
1862fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 56 |     int c2_field
1872fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 64 |     double c3_field
1882fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 72 |     int c4_field
1892fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 80 |     class A (virtual base)
1902fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 80 |       class B (primary base)
191227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 80 |         (B vftable pointer)
1922fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 84 |         int b_field
1932fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 88 |       int a_field
1942fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 92 |       char one
1952fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1962fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=80, dsize=80, align=8
197227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: nvsize=64, nvalign=8
1982fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
1992fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK: sizeof=96, dsize=96, align=8
2002fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: nvsize=96, nvalign=8
2012fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
2029bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman// CHECK: %struct.BaseStruct = type { double, float, %class.C }
2039bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
2042fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK:       0 | struct DerivedStruct
2052fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  0 |   struct BaseStruct (base)
2062fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  0 |     double v0
2072fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT:  8 |     float v1
2082fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 16 |     class C fg
2092fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 16 |       class D (primary base)
210227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 16 |         (D vftable pointer)
2112fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 24 |         double a
2122fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 32 |       class B (base)
213227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 32 |         (B vftable pointer)
2142fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 36 |         int b_field
2152fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 40 |       (C vbtable pointer)
2162fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 48 |       double c1_field
2172fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 56 |       int c2_field
2182fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 64 |       double c3_field
2192fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 72 |       int c4_field
2202fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 80 |       class A (virtual base)
2212fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 80 |         class B (primary base)
222227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 80 |           (B vftable pointer)
2232fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 84 |           int b_field
2242fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 88 |         int a_field
2252fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: 92 |         char one
2262fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=80, dsize=80, align=8
227227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: nvsize=64, nvalign=8
2282fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
2292fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK: 96 |   int x
2302fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: sizeof=104, dsize=104, align=8
2312fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman// CHECK-NEXT: nvsize=104, nvalign=8
23297c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
2339bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman// CHECK: %struct.DerivedStruct = type { %struct.BaseStruct, i32 }
2349bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
23597c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK:      0 | struct G
23697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT: 0 |   int g_field
23797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT: sizeof=4, dsize=4, align=4
23897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT: nvsize=4, nvalign=4
23997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
24097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK:       0 | struct H
24197c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT:  0 |   struct G (base)
24297c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT:  0 |     int g_field
243227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  4 |   (H vbtable pointer)
24497c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT:  8 |   class D (virtual base)
245227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  8 |     (D vftable pointer)
24697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT: 16 |     double a
24797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT: sizeof=24, dsize=24, align=8
248227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: nvsize=8, nvalign=4
249227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman
2509da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %struct.H = type { %struct.G, i32*, %class.D }
2519bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
252227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK:       0 | struct I
253227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  0 |   (I vftable pointer)
254227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT:  8 |   (I vbtable pointer)
255227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 16 |   double q
256227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 24 |   class D (virtual base)
257227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 24 |     (D vftable pointer)
258227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: 32 |     double a
259227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman// CHECK-NEXT: sizeof=40, dsize=40, align=8
26097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman// CHECK-NEXT: nvsize=24, nvalign=8
2619bc2c6e3b49523029f54596501cc1f3f2ebcaec2Eli Friedman
2629da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %struct.I = type { i32 (...)**, [4 x i8], i32*, double, %class.D }
2639da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK: %struct.I.base = type { i32 (...)**, [4 x i8], i32*, double }
2649da235244c2de2bcca654b518c66133c30ebde53John McCall
2659da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK:       0 | struct L
2669da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |   int l
2679da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: sizeof=4, dsize=4, align=4
2689da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: nvsize=4, nvalign=4
2699da235244c2de2bcca654b518c66133c30ebde53John McCall
2709da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK:       0 | struct K
2719da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |   int k
2729da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: sizeof=4, dsize=4, align=4
2739da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: nvsize=4, nvalign=4
2749da235244c2de2bcca654b518c66133c30ebde53John McCall
2759da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK:       0 | struct M
2769da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |   (M vbtable pointer)
2779da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |   int m
2789da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  8 |   struct K (virtual base)
2799da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  8 |     int k
2809da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: sizeof=12, dsize=12, align=4
2819da235244c2de2bcca654b518c66133c30ebde53John McCall
2829da235244c2de2bcca654b518c66133c30ebde53John McCall//CHECK: %struct.M = type { i32*, i32, %struct.K }
2839da235244c2de2bcca654b518c66133c30ebde53John McCall//CHECK: %struct.M.base = type { i32*, i32 }
2849da235244c2de2bcca654b518c66133c30ebde53John McCall
2859da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK:       0 | struct N
2869da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |   struct L (base)
2879da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |     int l
2889da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  8 |   struct M (base)
2899da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  8 |     (M vbtable pointer)
2909da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 12 |     int m
2919da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |   (N vftable pointer)
2929da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 16 |   struct K (virtual base)
2939da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 16 |     int k
2949da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: sizeof=20, dsize=20, align=4
2959da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: nvsize=16, nvalign=4
2969da235244c2de2bcca654b518c66133c30ebde53John McCall
2979da235244c2de2bcca654b518c66133c30ebde53John McCall//CHECK: %struct.N = type { i32 (...)**, %struct.L, %struct.M.base, %struct.K }
2989da235244c2de2bcca654b518c66133c30ebde53John McCall
2999da235244c2de2bcca654b518c66133c30ebde53John McCall// FIXME: MSVC place struct H at offset 8.
3009da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK:       0 | struct O
3019da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |   struct H (base)
3029da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |     struct G (base)
3039da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |       int g_field
3049da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  8 |     (H vbtable pointer)
3059da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 12 |   struct G (base)
3069da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 12 |     int g_field
3079da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |   (O vftable pointer)
3089da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 16 |   class D (virtual base)
3099da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 16 |     (D vftable pointer)
3109da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 24 |     double a
3119da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: sizeof=32, dsize=32, align=8
3129da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: nvsize=16, nvalign=4
3139da235244c2de2bcca654b518c66133c30ebde53John McCall
3149da235244c2de2bcca654b518c66133c30ebde53John McCall//CHECK: %struct.O = type { i32 (...)**, %struct.H.base, %struct.G, %class.D }
3159da235244c2de2bcca654b518c66133c30ebde53John McCall//CHECK: %struct.O.base = type { i32 (...)**, %struct.H.base, %struct.G }
3169da235244c2de2bcca654b518c66133c30ebde53John McCall
3179da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK:       0 | struct P
3189da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |   struct M (base)
3199da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  0 |     (M vbtable pointer)
3209da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  4 |     int m
3219da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT:  8 |   int p
3229da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 12 |   struct K (virtual base)
3239da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 12 |     int k
3249da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 16 |   struct L (virtual base)
3259da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: 16 |     int l
3269da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: sizeof=20, dsize=20, align=4
3279da235244c2de2bcca654b518c66133c30ebde53John McCall// CHECK-NEXT: nvsize=12, nvalign=4
3289da235244c2de2bcca654b518c66133c30ebde53John McCall
3299da235244c2de2bcca654b518c66133c30ebde53John McCall//CHECK: %struct.P = type { %struct.M.base, i32, %struct.K, %struct.L }
330901dd668931a70932ad09092959c42693409a3cdEli Friedman
331901dd668931a70932ad09092959c42693409a3cdEli Friedman// CHECK:       0 | struct R (empty)
332901dd668931a70932ad09092959c42693409a3cdEli Friedman// CHECK-NEXT:  sizeof=1, dsize=0, align=1
333901dd668931a70932ad09092959c42693409a3cdEli Friedman// CHECK-NEXT:  nvsize=0, nvalign=1
334901dd668931a70932ad09092959c42693409a3cdEli Friedman
335901dd668931a70932ad09092959c42693409a3cdEli Friedman//CHECK: %struct.R = type { i8 }
336