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