1674cf268SAaron Ballman // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
27e5cea5bSTomas Matheson // RUN:            | FileCheck %s --strict-whitespace
3674cf268SAaron Ballman // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
47e5cea5bSTomas Matheson // RUN:            | FileCheck %s -check-prefix CHECK-X64 --strict-whitespace
5bd1b0c69SWarren Hunt 
6bd1b0c69SWarren Hunt extern "C" int printf(const char *fmt, ...);
7bd1b0c69SWarren Hunt 
8bd1b0c69SWarren Hunt struct A4 {
9bd1b0c69SWarren Hunt 	int a;
A4A410bd1b0c69SWarren Hunt 	A4() : a(0xf00000a4) {}
11bd1b0c69SWarren Hunt };
12bd1b0c69SWarren Hunt 
13bd1b0c69SWarren Hunt struct B4 {
14bd1b0c69SWarren Hunt 	int a;
B4B415bd1b0c69SWarren Hunt 	B4() : a(0xf00000b4) {}
16bd1b0c69SWarren Hunt };
17bd1b0c69SWarren Hunt 
18bd1b0c69SWarren Hunt struct C4 {
19bd1b0c69SWarren Hunt 	int a;
C4C420bd1b0c69SWarren Hunt 	C4() : a(0xf00000c4) {}
fC421bd1b0c69SWarren Hunt 	virtual void f() {printf("C4");}
22bd1b0c69SWarren Hunt };
23bd1b0c69SWarren Hunt 
24bd1b0c69SWarren Hunt struct A16 {
25bd1b0c69SWarren Hunt 	__declspec(align(16)) int a;
A16A1626bd1b0c69SWarren Hunt 	A16() : a(0xf0000a16) {}
27bd1b0c69SWarren Hunt };
28bd1b0c69SWarren Hunt 
29bd1b0c69SWarren Hunt struct C16 {
30bd1b0c69SWarren Hunt 	__declspec(align(16)) int a;
C16C1631bd1b0c69SWarren Hunt 	C16() : a(0xf0000c16) {}
fC1632bd1b0c69SWarren Hunt 	virtual void f() {printf("C16");}
33bd1b0c69SWarren Hunt };
34bd1b0c69SWarren Hunt 
357e5cea5bSTomas Matheson struct TestF3 : A4, virtual C16 {
367e5cea5bSTomas Matheson   int a;
TestF3TestF3377e5cea5bSTomas Matheson   TestF3() : a(0xf00000f3) {}
387e5cea5bSTomas Matheson };
397e5cea5bSTomas Matheson 
407e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF3{{$}}
417e5cea5bSTomas Matheson // CHECK-NEXT:    0 |   struct A4 (base)
427e5cea5bSTomas Matheson // CHECK-NEXT:    0 |     int a
437e5cea5bSTomas Matheson // CHECK-NEXT:    4 |   (TestF3 vbtable pointer)
447e5cea5bSTomas Matheson // CHECK-NEXT:    8 |   int a
457e5cea5bSTomas Matheson // CHECK-NEXT:   16 |   struct C16 (virtual base)
467e5cea5bSTomas Matheson // CHECK-NEXT:   16 |     (C16 vftable pointer)
477e5cea5bSTomas Matheson // CHECK-NEXT:   32 |     int a
487e5cea5bSTomas Matheson // CHECK-NEXT:      | [sizeof=48, align=16
497e5cea5bSTomas Matheson // CHECK-NEXT:      |  nvsize=12, nvalign=16]
507e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF3{{$}}
517e5cea5bSTomas Matheson // CHECK-X64-NEXT:    0 |   struct A4 (base)
527e5cea5bSTomas Matheson // CHECK-X64-NEXT:    0 |     int a
537e5cea5bSTomas Matheson // CHECK-X64-NEXT:    8 |   (TestF3 vbtable pointer)
547e5cea5bSTomas Matheson // CHECK-X64-NEXT:   16 |   int a
557e5cea5bSTomas Matheson // CHECK-X64-NEXT:   32 |   struct C16 (virtual base)
567e5cea5bSTomas Matheson // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
577e5cea5bSTomas Matheson // CHECK-X64-NEXT:   48 |     int a
587e5cea5bSTomas Matheson // CHECK-X64-NEXT:      | [sizeof=64, align=16
597e5cea5bSTomas Matheson // CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
607e5cea5bSTomas Matheson 
617e5cea5bSTomas Matheson struct TestF7 : A4, virtual C16 {
627e5cea5bSTomas Matheson   int a;
TestF7TestF7637e5cea5bSTomas Matheson   TestF7() : a(0xf00000f7) {}
fTestF7647e5cea5bSTomas Matheson   virtual void f() { printf("F7"); }
657e5cea5bSTomas Matheson };
667e5cea5bSTomas Matheson 
677e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF7{{$}}
687e5cea5bSTomas Matheson // CHECK-NEXT:    0 |   struct A4 (base)
697e5cea5bSTomas Matheson // CHECK-NEXT:    0 |     int a
707e5cea5bSTomas Matheson // CHECK-NEXT:    4 |   (TestF7 vbtable pointer)
717e5cea5bSTomas Matheson // CHECK-NEXT:    8 |   int a
727e5cea5bSTomas Matheson // CHECK-NEXT:   28 |   (vtordisp for vbase C16)
737e5cea5bSTomas Matheson // CHECK-NEXT:   32 |   struct C16 (virtual base)
747e5cea5bSTomas Matheson // CHECK-NEXT:   32 |     (C16 vftable pointer)
757e5cea5bSTomas Matheson // CHECK-NEXT:   48 |     int a
767e5cea5bSTomas Matheson // CHECK-NEXT:      | [sizeof=64, align=16
777e5cea5bSTomas Matheson // CHECK-NEXT:      |  nvsize=12, nvalign=16]
787e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF7{{$}}
797e5cea5bSTomas Matheson // CHECK-X64-NEXT:    0 |   struct A4 (base)
807e5cea5bSTomas Matheson // CHECK-X64-NEXT:    0 |     int a
817e5cea5bSTomas Matheson // CHECK-X64-NEXT:    8 |   (TestF7 vbtable pointer)
827e5cea5bSTomas Matheson // CHECK-X64-NEXT:   16 |   int a
837e5cea5bSTomas Matheson // CHECK-X64-NEXT:   44 |   (vtordisp for vbase C16)
847e5cea5bSTomas Matheson // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
857e5cea5bSTomas Matheson // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
867e5cea5bSTomas Matheson // CHECK-X64-NEXT:   64 |     int a
877e5cea5bSTomas Matheson // CHECK-X64-NEXT:      | [sizeof=80, align=16
887e5cea5bSTomas Matheson // CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
897e5cea5bSTomas Matheson 
907e5cea5bSTomas Matheson struct TestF9 : A4, virtual C16 {
917e5cea5bSTomas Matheson   int a;
TestF9TestF9927e5cea5bSTomas Matheson   TestF9() : a(0xf00000f9) {}
gTestF9937e5cea5bSTomas Matheson   virtual void g() { printf("F9"); }
947e5cea5bSTomas Matheson };
957e5cea5bSTomas Matheson 
967e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF9{{$}}
977e5cea5bSTomas Matheson // CHECK-NEXT:    0 |   (TestF9 vftable pointer)
987e5cea5bSTomas Matheson // CHECK-NEXT:    4 |   struct A4 (base)
997e5cea5bSTomas Matheson // CHECK-NEXT:    4 |     int a
1007e5cea5bSTomas Matheson // CHECK-NEXT:    8 |   (TestF9 vbtable pointer)
1017e5cea5bSTomas Matheson // CHECK-NEXT:   12 |   int a
1027e5cea5bSTomas Matheson // CHECK-NEXT:   16 |   struct C16 (virtual base)
1037e5cea5bSTomas Matheson // CHECK-NEXT:   16 |     (C16 vftable pointer)
1047e5cea5bSTomas Matheson // CHECK-NEXT:   32 |     int a
1057e5cea5bSTomas Matheson // CHECK-NEXT:      | [sizeof=48, align=16
1067e5cea5bSTomas Matheson // CHECK-NEXT:      |  nvsize=16, nvalign=16]
1077e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF9{{$}}
1087e5cea5bSTomas Matheson // CHECK-X64-NEXT:    0 |   (TestF9 vftable pointer)
1097e5cea5bSTomas Matheson // CHECK-X64-NEXT:    8 |   struct A4 (base)
1107e5cea5bSTomas Matheson // CHECK-X64-NEXT:    8 |     int a
1117e5cea5bSTomas Matheson // CHECK-X64-NEXT:   16 |   (TestF9 vbtable pointer)
1127e5cea5bSTomas Matheson // CHECK-X64-NEXT:   24 |   int a
1137e5cea5bSTomas Matheson // CHECK-X64-NEXT:   32 |   struct C16 (virtual base)
1147e5cea5bSTomas Matheson // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
1157e5cea5bSTomas Matheson // CHECK-X64-NEXT:   48 |     int a
1167e5cea5bSTomas Matheson // CHECK-X64-NEXT:      | [sizeof=64, align=16
1177e5cea5bSTomas Matheson // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
1187e5cea5bSTomas Matheson 
1197e5cea5bSTomas Matheson struct TestFB : A16, virtual C16 {
1207e5cea5bSTomas Matheson   int a;
TestFBTestFB1217e5cea5bSTomas Matheson   TestFB() : a(0xf00000fb) {}
gTestFB1227e5cea5bSTomas Matheson   virtual void g() { printf("Fb"); }
1237e5cea5bSTomas Matheson };
1247e5cea5bSTomas Matheson 
1257e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestFB{{$}}
1267e5cea5bSTomas Matheson // CHECK-NEXT:    0 |   (TestFB vftable pointer)
1277e5cea5bSTomas Matheson // CHECK-NEXT:   16 |   struct A16 (base)
1287e5cea5bSTomas Matheson // CHECK-NEXT:   16 |     int a
1297e5cea5bSTomas Matheson // CHECK-NEXT:   32 |   (TestFB vbtable pointer)
1307e5cea5bSTomas Matheson // CHECK-NEXT:   48 |   int a
1317e5cea5bSTomas Matheson // CHECK-NEXT:   64 |   struct C16 (virtual base)
1327e5cea5bSTomas Matheson // CHECK-NEXT:   64 |     (C16 vftable pointer)
1337e5cea5bSTomas Matheson // CHECK-NEXT:   80 |     int a
1347e5cea5bSTomas Matheson // CHECK-NEXT:      | [sizeof=96, align=16
1357e5cea5bSTomas Matheson // CHECK-NEXT:      |  nvsize=64, nvalign=16]
1367e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestFB{{$}}
1377e5cea5bSTomas Matheson // CHECK-X64-NEXT:    0 |   (TestFB vftable pointer)
1387e5cea5bSTomas Matheson // CHECK-X64-NEXT:   16 |   struct A16 (base)
1397e5cea5bSTomas Matheson // CHECK-X64-NEXT:   16 |     int a
1407e5cea5bSTomas Matheson // CHECK-X64-NEXT:   32 |   (TestFB vbtable pointer)
1417e5cea5bSTomas Matheson // CHECK-X64-NEXT:   48 |   int a
1427e5cea5bSTomas Matheson // CHECK-X64-NEXT:   64 |   struct C16 (virtual base)
1437e5cea5bSTomas Matheson // CHECK-X64-NEXT:   64 |     (C16 vftable pointer)
1447e5cea5bSTomas Matheson // CHECK-X64-NEXT:   80 |     int a
1457e5cea5bSTomas Matheson // CHECK-X64-NEXT:      | [sizeof=96, align=16
1467e5cea5bSTomas Matheson // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
1477e5cea5bSTomas Matheson 
148bd1b0c69SWarren Hunt struct TestF0 : A4, virtual B4 {
149bd1b0c69SWarren Hunt 	int a;
TestF0TestF0150bd1b0c69SWarren Hunt 	TestF0() : a(0xf00000F0) {}
151bd1b0c69SWarren Hunt };
152bd1b0c69SWarren Hunt 
1537e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF0{{$}}
1544431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct A4 (base)
1554431fe6bSWarren Hunt // CHECK-NEXT:    0 |     int a
1564431fe6bSWarren Hunt // CHECK-NEXT:    4 |   (TestF0 vbtable pointer)
1574431fe6bSWarren Hunt // CHECK-NEXT:    8 |   int a
1584431fe6bSWarren Hunt // CHECK-NEXT:   12 |   struct B4 (virtual base)
1594431fe6bSWarren Hunt // CHECK-NEXT:   12 |     int a
1604431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=16, align=4
1614431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=12, nvalign=4]
1627e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF0{{$}}
1634431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct A4 (base)
1644431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     int a
1654431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |   (TestF0 vbtable pointer)
1664431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   int a
1674431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   struct B4 (virtual base)
1684431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     int a
1694431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=32, align=8
1704431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
171bd1b0c69SWarren Hunt 
172bd1b0c69SWarren Hunt struct TestF1 : A4, virtual A16 {
173bd1b0c69SWarren Hunt 	int a;
TestF1TestF1174bd1b0c69SWarren Hunt 	TestF1() : a(0xf00000f1) {}
175bd1b0c69SWarren Hunt };
176bd1b0c69SWarren Hunt 
1777e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF1{{$}}
1784431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct A4 (base)
1794431fe6bSWarren Hunt // CHECK-NEXT:    0 |     int a
1804431fe6bSWarren Hunt // CHECK-NEXT:    4 |   (TestF1 vbtable pointer)
1814431fe6bSWarren Hunt // CHECK-NEXT:    8 |   int a
1824431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A16 (virtual base)
1834431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
1844431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=32, align=16
185d640d7d9SWarren Hunt // CHECK-NEXT:      |  nvsize=12, nvalign=16]
1867e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF1{{$}}
1874431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct A4 (base)
1884431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     int a
1894431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |   (TestF1 vbtable pointer)
1904431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   int a
1914431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |   struct A16 (virtual base)
1924431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     int a
1934431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=48, align=16
194d640d7d9SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
195bd1b0c69SWarren Hunt 
196bd1b0c69SWarren Hunt struct TestF2 : A4, virtual C4 {
197bd1b0c69SWarren Hunt 	int a;
TestF2TestF2198bd1b0c69SWarren Hunt 	TestF2() : a(0xf00000f2) {}
199bd1b0c69SWarren Hunt };
200bd1b0c69SWarren Hunt 
2017e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF2{{$}}
2024431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct A4 (base)
2034431fe6bSWarren Hunt // CHECK-NEXT:    0 |     int a
2044431fe6bSWarren Hunt // CHECK-NEXT:    4 |   (TestF2 vbtable pointer)
2054431fe6bSWarren Hunt // CHECK-NEXT:    8 |   int a
2064431fe6bSWarren Hunt // CHECK-NEXT:   12 |   struct C4 (virtual base)
2074431fe6bSWarren Hunt // CHECK-NEXT:   12 |     (C4 vftable pointer)
2084431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
2094431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=20, align=4
2104431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=12, nvalign=4]
2117e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF2{{$}}
2124431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct A4 (base)
2134431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     int a
2144431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |   (TestF2 vbtable pointer)
2154431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   int a
2164431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   struct C4 (virtual base)
2174431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     (C4 vftable pointer)
2184431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     int a
2194431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=40, align=8
2204431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
221bd1b0c69SWarren Hunt 
222bd1b0c69SWarren Hunt struct TestF4 : TestF3, A4 {
223bd1b0c69SWarren Hunt 	int a;
TestF4TestF4224bd1b0c69SWarren Hunt 	TestF4() : a(0xf00000f4) {}
225bd1b0c69SWarren Hunt };
226bd1b0c69SWarren Hunt 
2277e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF4{{$}}
2284431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct TestF3 (base)
2294431fe6bSWarren Hunt // CHECK-NEXT:    0 |     struct A4 (base)
2304431fe6bSWarren Hunt // CHECK-NEXT:    0 |       int a
2314431fe6bSWarren Hunt // CHECK-NEXT:    4 |     (TestF3 vbtable pointer)
2324431fe6bSWarren Hunt // CHECK-NEXT:    8 |     int a
2334431fe6bSWarren Hunt // CHECK-NEXT:   12 |   struct A4 (base)
2344431fe6bSWarren Hunt // CHECK-NEXT:   12 |     int a
2354431fe6bSWarren Hunt // CHECK-NEXT:   16 |   int a
2364431fe6bSWarren Hunt // CHECK-NEXT:   32 |   struct C16 (virtual base)
2374431fe6bSWarren Hunt // CHECK-NEXT:   32 |     (C16 vftable pointer)
2384431fe6bSWarren Hunt // CHECK-NEXT:   48 |     int a
2394431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=64, align=16
2404431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=32, nvalign=16]
2417e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF4{{$}}
2424431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct TestF3 (base)
2434431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     struct A4 (base)
2444431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |       int a
2454431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |     (TestF3 vbtable pointer)
2464431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     int a
2474431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   struct A4 (base)
2484431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     int a
2494431fe6bSWarren Hunt // CHECK-X64-NEXT:   28 |   int a
2504431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |   struct C16 (virtual base)
2514431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
2524431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     int a
2534431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=64, align=16
2544431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
255bd1b0c69SWarren Hunt 
256bd1b0c69SWarren Hunt struct TestF5 : TestF3, A4 {
257bd1b0c69SWarren Hunt 	int a;
TestF5TestF5258bd1b0c69SWarren Hunt 	TestF5() : a(0xf00000f5) {}
gTestF5259bd1b0c69SWarren Hunt 	virtual void g() {printf("F5");}
260bd1b0c69SWarren Hunt };
261bd1b0c69SWarren Hunt 
2627e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF5{{$}}
2634431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (TestF5 vftable pointer)
2644431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct TestF3 (base)
2654431fe6bSWarren Hunt // CHECK-NEXT:   16 |     struct A4 (base)
2664431fe6bSWarren Hunt // CHECK-NEXT:   16 |       int a
2674431fe6bSWarren Hunt // CHECK-NEXT:   20 |     (TestF3 vbtable pointer)
2684431fe6bSWarren Hunt // CHECK-NEXT:   24 |     int a
2694431fe6bSWarren Hunt // CHECK-NEXT:   28 |   struct A4 (base)
2704431fe6bSWarren Hunt // CHECK-NEXT:   28 |     int a
2714431fe6bSWarren Hunt // CHECK-NEXT:   32 |   int a
2724431fe6bSWarren Hunt // CHECK-NEXT:   48 |   struct C16 (virtual base)
2734431fe6bSWarren Hunt // CHECK-NEXT:   48 |     (C16 vftable pointer)
2744431fe6bSWarren Hunt // CHECK-NEXT:   64 |     int a
2754431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=80, align=16
2764431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=48, nvalign=16]
2777e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF5{{$}}
2784431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (TestF5 vftable pointer)
2794431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   struct TestF3 (base)
2804431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     struct A4 (base)
2814431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |       int a
2824431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     (TestF3 vbtable pointer)
2834431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     int a
2844431fe6bSWarren Hunt // CHECK-X64-NEXT:   40 |   struct A4 (base)
2854431fe6bSWarren Hunt // CHECK-X64-NEXT:   40 |     int a
2864431fe6bSWarren Hunt // CHECK-X64-NEXT:   44 |   int a
2874431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
2884431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
2894431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |     int a
2904431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=80, align=16
2914431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
292bd1b0c69SWarren Hunt 
293bd1b0c69SWarren Hunt struct TestF6 : TestF3, A4 {
294bd1b0c69SWarren Hunt 	int a;
TestF6TestF6295bd1b0c69SWarren Hunt 	TestF6() : a(0xf00000f6) {}
fTestF6296bd1b0c69SWarren Hunt 	virtual void f() {printf("F6");}
297bd1b0c69SWarren Hunt };
298bd1b0c69SWarren Hunt 
2997e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF6{{$}}
3004431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct TestF3 (base)
3014431fe6bSWarren Hunt // CHECK-NEXT:    0 |     struct A4 (base)
3024431fe6bSWarren Hunt // CHECK-NEXT:    0 |       int a
3034431fe6bSWarren Hunt // CHECK-NEXT:    4 |     (TestF3 vbtable pointer)
3044431fe6bSWarren Hunt // CHECK-NEXT:    8 |     int a
3054431fe6bSWarren Hunt // CHECK-NEXT:   12 |   struct A4 (base)
3064431fe6bSWarren Hunt // CHECK-NEXT:   12 |     int a
3074431fe6bSWarren Hunt // CHECK-NEXT:   16 |   int a
3084431fe6bSWarren Hunt // CHECK-NEXT:   44 |   (vtordisp for vbase C16)
3094431fe6bSWarren Hunt // CHECK-NEXT:   48 |   struct C16 (virtual base)
3104431fe6bSWarren Hunt // CHECK-NEXT:   48 |     (C16 vftable pointer)
3114431fe6bSWarren Hunt // CHECK-NEXT:   64 |     int a
3124431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=80, align=16
3134431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=32, nvalign=16]
3147e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF6{{$}}
3154431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct TestF3 (base)
3164431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     struct A4 (base)
3174431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |       int a
3184431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |     (TestF3 vbtable pointer)
3194431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     int a
3204431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   struct A4 (base)
3214431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     int a
3224431fe6bSWarren Hunt // CHECK-X64-NEXT:   28 |   int a
3234431fe6bSWarren Hunt // CHECK-X64-NEXT:   44 |   (vtordisp for vbase C16)
3244431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
3254431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
3264431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |     int a
3274431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=80, align=16
3284431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
329bd1b0c69SWarren Hunt 
330bd1b0c69SWarren Hunt struct TestF8 : TestF7, A4 {
331bd1b0c69SWarren Hunt 	int a;
TestF8TestF8332bd1b0c69SWarren Hunt 	TestF8() : a(0xf00000f8) {}
fTestF8333bd1b0c69SWarren Hunt 	virtual void f() {printf("F8");}
334bd1b0c69SWarren Hunt };
335bd1b0c69SWarren Hunt 
3367e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestF8{{$}}
3374431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct TestF7 (base)
3384431fe6bSWarren Hunt // CHECK-NEXT:    0 |     struct A4 (base)
3394431fe6bSWarren Hunt // CHECK-NEXT:    0 |       int a
3404431fe6bSWarren Hunt // CHECK-NEXT:    4 |     (TestF7 vbtable pointer)
3414431fe6bSWarren Hunt // CHECK-NEXT:    8 |     int a
3424431fe6bSWarren Hunt // CHECK-NEXT:   12 |   struct A4 (base)
3434431fe6bSWarren Hunt // CHECK-NEXT:   12 |     int a
3444431fe6bSWarren Hunt // CHECK-NEXT:   16 |   int a
3454431fe6bSWarren Hunt // CHECK-NEXT:   44 |   (vtordisp for vbase C16)
3464431fe6bSWarren Hunt // CHECK-NEXT:   48 |   struct C16 (virtual base)
3474431fe6bSWarren Hunt // CHECK-NEXT:   48 |     (C16 vftable pointer)
3484431fe6bSWarren Hunt // CHECK-NEXT:   64 |     int a
3494431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=80, align=16
3504431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=32, nvalign=16]
3517e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestF8{{$}}
3524431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct TestF7 (base)
3534431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     struct A4 (base)
3544431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |       int a
3554431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |     (TestF7 vbtable pointer)
3564431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     int a
3574431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   struct A4 (base)
3584431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     int a
3594431fe6bSWarren Hunt // CHECK-X64-NEXT:   28 |   int a
3604431fe6bSWarren Hunt // CHECK-X64-NEXT:   44 |   (vtordisp for vbase C16)
3614431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
3624431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
3634431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |     int a
3644431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=80, align=16
3654431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
366bd1b0c69SWarren Hunt 
367bd1b0c69SWarren Hunt struct TestFA : TestF9, A4 {
368bd1b0c69SWarren Hunt 	int a;
TestFATestFA369bd1b0c69SWarren Hunt 	TestFA() : a(0xf00000fa) {}
gTestFA370bd1b0c69SWarren Hunt 	virtual void g() {printf("FA");}
371bd1b0c69SWarren Hunt };
372bd1b0c69SWarren Hunt 
3737e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestFA{{$}}
3744431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct TestF9 (primary base)
3754431fe6bSWarren Hunt // CHECK-NEXT:    0 |     (TestF9 vftable pointer)
3764431fe6bSWarren Hunt // CHECK-NEXT:    4 |     struct A4 (base)
3774431fe6bSWarren Hunt // CHECK-NEXT:    4 |       int a
3784431fe6bSWarren Hunt // CHECK-NEXT:    8 |     (TestF9 vbtable pointer)
3794431fe6bSWarren Hunt // CHECK-NEXT:   12 |     int a
3804431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A4 (base)
3814431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
3824431fe6bSWarren Hunt // CHECK-NEXT:   20 |   int a
3834431fe6bSWarren Hunt // CHECK-NEXT:   32 |   struct C16 (virtual base)
3844431fe6bSWarren Hunt // CHECK-NEXT:   32 |     (C16 vftable pointer)
3854431fe6bSWarren Hunt // CHECK-NEXT:   48 |     int a
3864431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=64, align=16
3874431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=32, nvalign=16]
3887e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestFA{{$}}
3894431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct TestF9 (primary base)
3904431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     (TestF9 vftable pointer)
3914431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |     struct A4 (base)
3924431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |       int a
3934431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     (TestF9 vbtable pointer)
3944431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |     int a
3954431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |   struct A4 (base)
3964431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     int a
3974431fe6bSWarren Hunt // CHECK-X64-NEXT:   36 |   int a
3984431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
3994431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
4004431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |     int a
4014431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=80, align=16
4024431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
403bd1b0c69SWarren Hunt 
404bd1b0c69SWarren Hunt struct TestFC : TestFB, A4 {
405bd1b0c69SWarren Hunt 	int a;
TestFCTestFC406bd1b0c69SWarren Hunt 	TestFC() : a(0xf00000fc) {}
gTestFC407bd1b0c69SWarren Hunt 	virtual void g() {printf("FC");}
408bd1b0c69SWarren Hunt };
409bd1b0c69SWarren Hunt 
4107e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct TestFC{{$}}
4114431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct TestFB (primary base)
4124431fe6bSWarren Hunt // CHECK-NEXT:    0 |     (TestFB vftable pointer)
4134431fe6bSWarren Hunt // CHECK-NEXT:   16 |     struct A16 (base)
4144431fe6bSWarren Hunt // CHECK-NEXT:   16 |       int a
4154431fe6bSWarren Hunt // CHECK-NEXT:   32 |     (TestFB vbtable pointer)
4164431fe6bSWarren Hunt // CHECK-NEXT:   48 |     int a
4174431fe6bSWarren Hunt // CHECK-NEXT:   64 |   struct A4 (base)
4184431fe6bSWarren Hunt // CHECK-NEXT:   64 |     int a
4194431fe6bSWarren Hunt // CHECK-NEXT:   68 |   int a
4204431fe6bSWarren Hunt // CHECK-NEXT:   80 |   struct C16 (virtual base)
4214431fe6bSWarren Hunt // CHECK-NEXT:   80 |     (C16 vftable pointer)
4224431fe6bSWarren Hunt // CHECK-NEXT:   96 |     int a
4234431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=112, align=16
4244431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=80, nvalign=16]
4257e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct TestFC{{$}}
4264431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct TestFB (primary base)
4274431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     (TestFB vftable pointer)
4284431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     struct A16 (base)
4294431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |       int a
4304431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     (TestFB vbtable pointer)
4314431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     int a
432c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |   struct A4 (base)
433c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |     int a
434c89450e0SWarren Hunt // CHECK-X64-NEXT:   68 |   int a
435c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |   struct C16 (virtual base)
436c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |     (C16 vftable pointer)
437c89450e0SWarren Hunt // CHECK-X64-NEXT:   96 |     int a
438c89450e0SWarren Hunt // CHECK-X64-NEXT:      | [sizeof=112, align=16
439c89450e0SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
440bd1b0c69SWarren Hunt 
441bd1b0c69SWarren Hunt struct A16f {
442bd1b0c69SWarren Hunt 	__declspec(align(16)) int a;
A16fA16f443bd1b0c69SWarren Hunt 	A16f() : a(0xf0000a16) {}
fA16f444bd1b0c69SWarren Hunt 	virtual void f() {printf("A16f");}
445bd1b0c69SWarren Hunt };
446bd1b0c69SWarren Hunt 
YY447bd1b0c69SWarren Hunt struct Y { char y; Y() : y(0xaa) {} };
448bd1b0c69SWarren Hunt struct X : virtual A16f {};
449bd1b0c69SWarren Hunt 
450bd1b0c69SWarren Hunt struct B : A4, Y, X {
451bd1b0c69SWarren Hunt 	int a;
BB452bd1b0c69SWarren Hunt 	B() : a(0xf000000b) {}
453bd1b0c69SWarren Hunt };
454bd1b0c69SWarren Hunt 
455bd1b0c69SWarren Hunt struct F0 : A4, B {
456bd1b0c69SWarren Hunt 	int a;
F0F0457bd1b0c69SWarren Hunt 	F0() : a(0xf00000f0) {}
gF0458bd1b0c69SWarren Hunt 	virtual void g() {printf("F0");}
459bd1b0c69SWarren Hunt };
460bd1b0c69SWarren Hunt 
4617e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F0{{$}}
4624431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (F0 vftable pointer)
4634431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A4 (base)
4644431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
4654431fe6bSWarren Hunt // CHECK-NEXT:   32 |   struct B (base)
4664431fe6bSWarren Hunt // CHECK-NEXT:   32 |     struct A4 (base)
4674431fe6bSWarren Hunt // CHECK-NEXT:   32 |       int a
4684431fe6bSWarren Hunt // CHECK-NEXT:   36 |     struct Y (base)
4694431fe6bSWarren Hunt // CHECK-NEXT:   36 |       char y
4704431fe6bSWarren Hunt // CHECK-NEXT:   48 |     struct X (base)
4714431fe6bSWarren Hunt // CHECK-NEXT:   48 |       (X vbtable pointer)
4724431fe6bSWarren Hunt // CHECK-NEXT:   52 |     int a
4734431fe6bSWarren Hunt // CHECK-NEXT:   64 |   int a
4744431fe6bSWarren Hunt // CHECK-NEXT:   80 |   struct A16f (virtual base)
4754431fe6bSWarren Hunt // CHECK-NEXT:   80 |     (A16f vftable pointer)
4764431fe6bSWarren Hunt // CHECK-NEXT:   96 |     int a
4774431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=112, align=16
4784431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=80, nvalign=16]
4797e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F0{{$}}
4804431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (F0 vftable pointer)
4814431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   struct A4 (base)
4824431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     int a
483c89450e0SWarren Hunt // CHECK-X64-NEXT:   32 |   struct B (base)
484c89450e0SWarren Hunt // CHECK-X64-NEXT:   32 |     struct A4 (base)
485c89450e0SWarren Hunt // CHECK-X64-NEXT:   32 |       int a
486c89450e0SWarren Hunt // CHECK-X64-NEXT:   36 |     struct Y (base)
487c89450e0SWarren Hunt // CHECK-X64-NEXT:   36 |       char y
488c89450e0SWarren Hunt // CHECK-X64-NEXT:   48 |     struct X (base)
489c89450e0SWarren Hunt // CHECK-X64-NEXT:   48 |       (X vbtable pointer)
490c89450e0SWarren Hunt // CHECK-X64-NEXT:   56 |     int a
491c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |   int a
492c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |   struct A16f (virtual base)
493c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |     (A16f vftable pointer)
494c89450e0SWarren Hunt // CHECK-X64-NEXT:   96 |     int a
495c89450e0SWarren Hunt // CHECK-X64-NEXT:      | [sizeof=112, align=16
496c89450e0SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
497bd1b0c69SWarren Hunt 
498bd1b0c69SWarren Hunt struct F1 : B, A4 {
499bd1b0c69SWarren Hunt 	int a;
F1F1500bd1b0c69SWarren Hunt 	F1() : a(0xf00000f1) {}
gF1501bd1b0c69SWarren Hunt 	virtual void g() {printf("F1");}
502bd1b0c69SWarren Hunt };
503bd1b0c69SWarren Hunt 
5047e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F1{{$}}
5054431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (F1 vftable pointer)
5064431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct B (base)
5074431fe6bSWarren Hunt // CHECK-NEXT:   16 |     struct A4 (base)
5084431fe6bSWarren Hunt // CHECK-NEXT:   16 |       int a
5094431fe6bSWarren Hunt // CHECK-NEXT:   20 |     struct Y (base)
5104431fe6bSWarren Hunt // CHECK-NEXT:   20 |       char y
5114431fe6bSWarren Hunt // CHECK-NEXT:   32 |     struct X (base)
5124431fe6bSWarren Hunt // CHECK-NEXT:   32 |       (X vbtable pointer)
5134431fe6bSWarren Hunt // CHECK-NEXT:   36 |     int a
5144431fe6bSWarren Hunt // CHECK-NEXT:   48 |   struct A4 (base)
5154431fe6bSWarren Hunt // CHECK-NEXT:   48 |     int a
5164431fe6bSWarren Hunt // CHECK-NEXT:   52 |   int a
5174431fe6bSWarren Hunt // CHECK-NEXT:   64 |   struct A16f (virtual base)
5184431fe6bSWarren Hunt // CHECK-NEXT:   64 |     (A16f vftable pointer)
5194431fe6bSWarren Hunt // CHECK-NEXT:   80 |     int a
5204431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=96, align=16
5214431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=64, nvalign=16]
5227e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F1{{$}}
5234431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (F1 vftable pointer)
5244431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   struct B (base)
5254431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     struct A4 (base)
5264431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |       int a
5274431fe6bSWarren Hunt // CHECK-X64-NEXT:   20 |     struct Y (base)
5284431fe6bSWarren Hunt // CHECK-X64-NEXT:   20 |       char y
5294431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     struct X (base)
5304431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |       (X vbtable pointer)
5314431fe6bSWarren Hunt // CHECK-X64-NEXT:   40 |     int a
5324431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |   struct A4 (base)
5334431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     int a
5344431fe6bSWarren Hunt // CHECK-X64-NEXT:   52 |   int a
5354431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |   struct A16f (virtual base)
5364431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |     (A16f vftable pointer)
5374431fe6bSWarren Hunt // CHECK-X64-NEXT:   80 |     int a
5384431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=96, align=16
5394431fe6bSWarren Hunt // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
540bd1b0c69SWarren Hunt 
541bd1b0c69SWarren Hunt struct F2 : A4, virtual A16f {
542bd1b0c69SWarren Hunt 	int a;
F2F2543bd1b0c69SWarren Hunt 	F2() : a(0xf00000f2) {}
gF2544bd1b0c69SWarren Hunt 	virtual void g() {printf("F2");}
545bd1b0c69SWarren Hunt };
546bd1b0c69SWarren Hunt 
5477e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F2{{$}}
5484431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (F2 vftable pointer)
5494431fe6bSWarren Hunt // CHECK-NEXT:    4 |   struct A4 (base)
5504431fe6bSWarren Hunt // CHECK-NEXT:    4 |     int a
5514431fe6bSWarren Hunt // CHECK-NEXT:    8 |   (F2 vbtable pointer)
5524431fe6bSWarren Hunt // CHECK-NEXT:   12 |   int a
5534431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A16f (virtual base)
5544431fe6bSWarren Hunt // CHECK-NEXT:   16 |     (A16f vftable pointer)
5554431fe6bSWarren Hunt // CHECK-NEXT:   32 |     int a
5564431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=48, align=16
557d640d7d9SWarren Hunt // CHECK-NEXT:      |  nvsize=16, nvalign=16]
5587e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F2{{$}}
5594431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (F2 vftable pointer)
5604431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |   struct A4 (base)
5614431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |     int a
5624431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   (F2 vbtable pointer)
5634431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   int a
5644431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |   struct A16f (virtual base)
5654431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     (A16f vftable pointer)
5664431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     int a
5674431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=64, align=16
568d640d7d9SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
569bd1b0c69SWarren Hunt 
570bd1b0c69SWarren Hunt struct F3 : A4, virtual A16f {
571bd1b0c69SWarren Hunt 	__declspec(align(16)) int a;
F3F3572bd1b0c69SWarren Hunt 	F3() : a(0xf00000f3) {}
gF3573bd1b0c69SWarren Hunt 	virtual void g() {printf("F3");}
574bd1b0c69SWarren Hunt };
575bd1b0c69SWarren Hunt 
5767e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F3{{$}}
5774431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (F3 vftable pointer)
5784431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A4 (base)
5794431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
5804431fe6bSWarren Hunt // CHECK-NEXT:   20 |   (F3 vbtable pointer)
5814431fe6bSWarren Hunt // CHECK-NEXT:   48 |   int a
5824431fe6bSWarren Hunt // CHECK-NEXT:   64 |   struct A16f (virtual base)
5834431fe6bSWarren Hunt // CHECK-NEXT:   64 |     (A16f vftable pointer)
5844431fe6bSWarren Hunt // CHECK-NEXT:   80 |     int a
5854431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=96, align=16
5864431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=64, nvalign=16]
5877e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F3{{$}}
5884431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (F3 vftable pointer)
589c89450e0SWarren Hunt // CHECK-X64-NEXT:   16 |   struct A4 (base)
590c89450e0SWarren Hunt // CHECK-X64-NEXT:   16 |     int a
591c89450e0SWarren Hunt // CHECK-X64-NEXT:   24 |   (F3 vbtable pointer)
592c89450e0SWarren Hunt // CHECK-X64-NEXT:   48 |   int a
593c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |   struct A16f (virtual base)
594c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |     (A16f vftable pointer)
595c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |     int a
596c89450e0SWarren Hunt // CHECK-X64-NEXT:      | [sizeof=96, align=16
597c89450e0SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
598bd1b0c69SWarren Hunt 
599bd1b0c69SWarren Hunt struct F4 : A4, B {
600bd1b0c69SWarren Hunt 	__declspec(align(16)) int a;
F4F4601bd1b0c69SWarren Hunt 	F4() : a(0xf00000f4) {}
gF4602bd1b0c69SWarren Hunt 	virtual void g() {printf("F4");}
603bd1b0c69SWarren Hunt };
604bd1b0c69SWarren Hunt 
6057e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F4{{$}}
6064431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (F4 vftable pointer)
6074431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A4 (base)
6084431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
6094431fe6bSWarren Hunt // CHECK-NEXT:   32 |   struct B (base)
6104431fe6bSWarren Hunt // CHECK-NEXT:   32 |     struct A4 (base)
6114431fe6bSWarren Hunt // CHECK-NEXT:   32 |       int a
6124431fe6bSWarren Hunt // CHECK-NEXT:   36 |     struct Y (base)
6134431fe6bSWarren Hunt // CHECK-NEXT:   36 |       char y
6144431fe6bSWarren Hunt // CHECK-NEXT:   48 |     struct X (base)
6154431fe6bSWarren Hunt // CHECK-NEXT:   48 |       (X vbtable pointer)
6164431fe6bSWarren Hunt // CHECK-NEXT:   52 |     int a
6174431fe6bSWarren Hunt // CHECK-NEXT:   64 |   int a
6184431fe6bSWarren Hunt // CHECK-NEXT:   80 |   struct A16f (virtual base)
6194431fe6bSWarren Hunt // CHECK-NEXT:   80 |     (A16f vftable pointer)
6204431fe6bSWarren Hunt // CHECK-NEXT:   96 |     int a
6214431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=112, align=16
6224431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=80, nvalign=16]
6237e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F4{{$}}
6244431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (F4 vftable pointer)
6254431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   struct A4 (base)
6264431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     int a
627c89450e0SWarren Hunt // CHECK-X64-NEXT:   32 |   struct B (base)
628c89450e0SWarren Hunt // CHECK-X64-NEXT:   32 |     struct A4 (base)
629c89450e0SWarren Hunt // CHECK-X64-NEXT:   32 |       int a
630c89450e0SWarren Hunt // CHECK-X64-NEXT:   36 |     struct Y (base)
631c89450e0SWarren Hunt // CHECK-X64-NEXT:   36 |       char y
632c89450e0SWarren Hunt // CHECK-X64-NEXT:   48 |     struct X (base)
633c89450e0SWarren Hunt // CHECK-X64-NEXT:   48 |       (X vbtable pointer)
634c89450e0SWarren Hunt // CHECK-X64-NEXT:   56 |     int a
635c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |   int a
636c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |   struct A16f (virtual base)
637c89450e0SWarren Hunt // CHECK-X64-NEXT:   80 |     (A16f vftable pointer)
638c89450e0SWarren Hunt // CHECK-X64-NEXT:   96 |     int a
639c89450e0SWarren Hunt // CHECK-X64-NEXT:      | [sizeof=112, align=16
640c89450e0SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
641bd1b0c69SWarren Hunt 
642bd1b0c69SWarren Hunt struct F5 : A16f, virtual A4 {
643bd1b0c69SWarren Hunt 	int a;
F5F5644bd1b0c69SWarren Hunt 	F5() : a(0xf00000f5) {}
gF5645bd1b0c69SWarren Hunt 	virtual void g() {printf("F5");}
646bd1b0c69SWarren Hunt };
647bd1b0c69SWarren Hunt 
6487e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F5{{$}}
6494431fe6bSWarren Hunt // CHECK-NEXT:    0 |   struct A16f (primary base)
6504431fe6bSWarren Hunt // CHECK-NEXT:    0 |     (A16f vftable pointer)
6514431fe6bSWarren Hunt // CHECK-NEXT:   16 |     int a
6524431fe6bSWarren Hunt // CHECK-NEXT:   32 |   (F5 vbtable pointer)
6534431fe6bSWarren Hunt // CHECK-NEXT:   48 |   int a
6544431fe6bSWarren Hunt // CHECK-NEXT:   64 |   struct A4 (virtual base)
6554431fe6bSWarren Hunt // CHECK-NEXT:   64 |     int a
6564431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=80, align=16
6574431fe6bSWarren Hunt // CHECK-NEXT:      |  nvsize=64, nvalign=16]
6587e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F5{{$}}
6594431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   struct A16f (primary base)
6604431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |     (A16f vftable pointer)
6614431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |     int a
6624431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |   (F5 vbtable pointer)
6634431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |   int a
664c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |   struct A4 (virtual base)
665c89450e0SWarren Hunt // CHECK-X64-NEXT:   64 |     int a
666c89450e0SWarren Hunt // CHECK-X64-NEXT:      | [sizeof=80, align=16
667c89450e0SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
668bd1b0c69SWarren Hunt 
669bd1b0c69SWarren Hunt struct F6 : virtual A16f, A4, virtual B {
670bd1b0c69SWarren Hunt 	int a;
F6F6671bd1b0c69SWarren Hunt 	F6() : a(0xf00000f6) {}
gF6672bd1b0c69SWarren Hunt 	virtual void g() {printf("F6");}
673bd1b0c69SWarren Hunt };
674bd1b0c69SWarren Hunt 
6757e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct F6{{$}}
6764431fe6bSWarren Hunt // CHECK-NEXT:    0 |   (F6 vftable pointer)
6774431fe6bSWarren Hunt // CHECK-NEXT:    4 |   struct A4 (base)
6784431fe6bSWarren Hunt // CHECK-NEXT:    4 |     int a
6794431fe6bSWarren Hunt // CHECK-NEXT:    8 |   (F6 vbtable pointer)
6804431fe6bSWarren Hunt // CHECK-NEXT:   12 |   int a
6814431fe6bSWarren Hunt // CHECK-NEXT:   16 |   struct A16f (virtual base)
6824431fe6bSWarren Hunt // CHECK-NEXT:   16 |     (A16f vftable pointer)
6834431fe6bSWarren Hunt // CHECK-NEXT:   32 |     int a
6844431fe6bSWarren Hunt // CHECK-NEXT:   48 |   struct B (virtual base)
6854431fe6bSWarren Hunt // CHECK-NEXT:   48 |     struct A4 (base)
6864431fe6bSWarren Hunt // CHECK-NEXT:   48 |       int a
6874431fe6bSWarren Hunt // CHECK-NEXT:   52 |     struct Y (base)
6884431fe6bSWarren Hunt // CHECK-NEXT:   52 |       char y
6894431fe6bSWarren Hunt // CHECK-NEXT:   64 |     struct X (base)
6904431fe6bSWarren Hunt // CHECK-NEXT:   64 |       (X vbtable pointer)
6914431fe6bSWarren Hunt // CHECK-NEXT:   68 |     int a
6924431fe6bSWarren Hunt // CHECK-NEXT:      | [sizeof=80, align=16
693d640d7d9SWarren Hunt // CHECK-NEXT:      |  nvsize=16, nvalign=16]
6947e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct F6{{$}}
6954431fe6bSWarren Hunt // CHECK-X64-NEXT:    0 |   (F6 vftable pointer)
6964431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |   struct A4 (base)
6974431fe6bSWarren Hunt // CHECK-X64-NEXT:    8 |     int a
6984431fe6bSWarren Hunt // CHECK-X64-NEXT:   16 |   (F6 vbtable pointer)
6994431fe6bSWarren Hunt // CHECK-X64-NEXT:   24 |   int a
7004431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |   struct A16f (virtual base)
7014431fe6bSWarren Hunt // CHECK-X64-NEXT:   32 |     (A16f vftable pointer)
7024431fe6bSWarren Hunt // CHECK-X64-NEXT:   48 |     int a
7034431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |   struct B (virtual base)
7044431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |     struct A4 (base)
7054431fe6bSWarren Hunt // CHECK-X64-NEXT:   64 |       int a
7064431fe6bSWarren Hunt // CHECK-X64-NEXT:   68 |     struct Y (base)
7074431fe6bSWarren Hunt // CHECK-X64-NEXT:   68 |       char y
7084431fe6bSWarren Hunt // CHECK-X64-NEXT:   80 |     struct X (base)
7094431fe6bSWarren Hunt // CHECK-X64-NEXT:   80 |       (X vbtable pointer)
7104431fe6bSWarren Hunt // CHECK-X64-NEXT:   88 |     int a
7114431fe6bSWarren Hunt // CHECK-X64-NEXT:      | [sizeof=96, align=16
712d640d7d9SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
713bd1b0c69SWarren Hunt 
7144f017ceeSReid Kleckner struct ArrayFieldOfRecords {
7154f017ceeSReid Kleckner   A4 InlineElts[2];
7164f017ceeSReid Kleckner };
7174f017ceeSReid Kleckner 
7187e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct ArrayFieldOfRecords{{$}}
719*888673b6SJonas Devlieghere // CHECK-NEXT:    0 |   struct A4[2] InlineElts
7204f017ceeSReid Kleckner // CHECK-NEXT:      | [sizeof=8, align=4
7214f017ceeSReid Kleckner // CHECK-NEXT:      |  nvsize=8, nvalign=4]
7227e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct ArrayFieldOfRecords{{$}}
723*888673b6SJonas Devlieghere // CHECK-X64-NEXT:    0 |   struct A4[2] InlineElts
7244f017ceeSReid Kleckner // CHECK-X64-NEXT:      | [sizeof=8, align=4
7254f017ceeSReid Kleckner // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
7264f017ceeSReid Kleckner 
727c8594203SWarren Hunt struct ArrayOfArrayFieldOfRecords {
728c8594203SWarren Hunt   A4 InlineElts[2][2];
729c8594203SWarren Hunt };
730c8594203SWarren Hunt 
7317e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct ArrayOfArrayFieldOfRecords{{$}}
732*888673b6SJonas Devlieghere // CHECK-NEXT:    0 |   struct A4[2][2] InlineElts
733c8594203SWarren Hunt // CHECK-NEXT:      | [sizeof=16, align=4
734c8594203SWarren Hunt // CHECK-NEXT:      |  nvsize=16, nvalign=4]
7357e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct ArrayOfArrayFieldOfRecords{{$}}
736*888673b6SJonas Devlieghere // CHECK-X64-NEXT:    0 |   struct A4[2][2] InlineElts
737c8594203SWarren Hunt // CHECK-X64-NEXT:      | [sizeof=16, align=4
738c8594203SWarren Hunt // CHECK-X64-NEXT:      |  nvsize=16, nvalign=4]
739c8594203SWarren Hunt 
740db673ca2SReid Kleckner struct RecordArrayTypedef {
741db673ca2SReid Kleckner   typedef A4 ArrayTy[2];
742db673ca2SReid Kleckner   ArrayTy InlineElts[2];
743db673ca2SReid Kleckner };
744db673ca2SReid Kleckner 
7457e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct RecordArrayTypedef{{$}}
746*888673b6SJonas Devlieghere // CHECK-NEXT:    0 |   RecordArrayTypedef::ArrayTy[2] InlineElts
747db673ca2SReid Kleckner // CHECK-NEXT:      | [sizeof=16, align=4
748db673ca2SReid Kleckner // CHECK-NEXT:      |  nvsize=16, nvalign=4]
7497e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct RecordArrayTypedef{{$}}
750*888673b6SJonas Devlieghere // CHECK-X64-NEXT:    0 |   RecordArrayTypedef::ArrayTy[2] InlineElts
751db673ca2SReid Kleckner // CHECK-X64-NEXT:      | [sizeof=16, align=4
752db673ca2SReid Kleckner // CHECK-X64-NEXT:      |  nvsize=16, nvalign=4]
753db673ca2SReid Kleckner 
75400a061dcSDavid Majnemer struct EmptyIntMemb {
75500a061dcSDavid Majnemer   int FlexArrayMemb[0];
75600a061dcSDavid Majnemer };
75700a061dcSDavid Majnemer 
7587e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct EmptyIntMemb{{$}}
75900a061dcSDavid Majnemer // CHECK-NEXT:    0 |   int[0] FlexArrayMemb
76000a061dcSDavid Majnemer // CHECK-NEXT:      | [sizeof=1, align=4
76100a061dcSDavid Majnemer // CHECK-NEXT:      |  nvsize=0, nvalign=4]
7627e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct EmptyIntMemb{{$}}
76300a061dcSDavid Majnemer // CHECK-X64-NEXT:    0 |   int[0] FlexArrayMemb
76400a061dcSDavid Majnemer // CHECK-X64-NEXT:      | [sizeof=4, align=4
76500a061dcSDavid Majnemer // CHECK-X64-NEXT:      |  nvsize=0, nvalign=4]
76600a061dcSDavid Majnemer 
76700a061dcSDavid Majnemer struct EmptyLongLongMemb {
76800a061dcSDavid Majnemer   long long FlexArrayMemb[0];
76900a061dcSDavid Majnemer };
77000a061dcSDavid Majnemer 
7717e5cea5bSTomas Matheson // CHECK-LABEL:   0 | struct EmptyLongLongMemb{{$}}
77200a061dcSDavid Majnemer // CHECK-NEXT:    0 |   long long[0] FlexArrayMemb
77300a061dcSDavid Majnemer // CHECK-NEXT:      | [sizeof=1, align=8
77400a061dcSDavid Majnemer // CHECK-NEXT:      |  nvsize=0, nvalign=8]
7757e5cea5bSTomas Matheson // CHECK-X64-LABEL:   0 | struct EmptyLongLongMemb{{$}}
77600a061dcSDavid Majnemer // CHECK-X64-NEXT:    0 |   long long[0] FlexArrayMemb
77700a061dcSDavid Majnemer // CHECK-X64-NEXT:      | [sizeof=8, align=8
77800a061dcSDavid Majnemer // CHECK-X64-NEXT:      |  nvsize=0, nvalign=8]
77900a061dcSDavid Majnemer 
780bd1b0c69SWarren Hunt int a[
781bd1b0c69SWarren Hunt sizeof(TestF0)+
782bd1b0c69SWarren Hunt sizeof(TestF1)+
783bd1b0c69SWarren Hunt sizeof(TestF2)+
784bd1b0c69SWarren Hunt sizeof(TestF3)+
785bd1b0c69SWarren Hunt sizeof(TestF4)+
786bd1b0c69SWarren Hunt sizeof(TestF5)+
787bd1b0c69SWarren Hunt sizeof(TestF6)+
788bd1b0c69SWarren Hunt sizeof(TestF7)+
789bd1b0c69SWarren Hunt sizeof(TestF8)+
790bd1b0c69SWarren Hunt sizeof(TestF9)+
791bd1b0c69SWarren Hunt sizeof(TestFA)+
792bd1b0c69SWarren Hunt sizeof(TestFB)+
793bd1b0c69SWarren Hunt sizeof(TestFC)+
794bd1b0c69SWarren Hunt sizeof(F0)+
795bd1b0c69SWarren Hunt sizeof(F1)+
796bd1b0c69SWarren Hunt sizeof(F2)+
797bd1b0c69SWarren Hunt sizeof(F3)+
798bd1b0c69SWarren Hunt sizeof(F4)+
799bd1b0c69SWarren Hunt sizeof(F5)+
8004f017ceeSReid Kleckner sizeof(F6)+
801c8594203SWarren Hunt sizeof(ArrayFieldOfRecords)+
802c8594203SWarren Hunt sizeof(ArrayOfArrayFieldOfRecords)+
803db673ca2SReid Kleckner sizeof(RecordArrayTypedef)+
80400a061dcSDavid Majnemer sizeof(EmptyIntMemb)+
80500a061dcSDavid Majnemer sizeof(EmptyLongLongMemb)+
806c8594203SWarren Hunt 0];
807