blob: 3edf4370eb2074dae0d9e0bf2d9cc665a682ca88 [file] [log] [blame]
Aaron Ballman674cf262015-05-26 19:44:52 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \
Warren Huntbd1b0c62013-10-14 19:08:58 +00002// RUN: | FileCheck %s
Aaron Ballman674cf262015-05-26 19:44:52 +00003// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \
Warren Hunt55d8e822013-10-23 23:53:07 +00004// RUN: | FileCheck %s -check-prefix CHECK-X64
Warren Huntbd1b0c62013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 { char a; B0() : a(0xB0) {} };
9struct __declspec(align(1)) B1 {};
10
Warren Huntd840e402013-11-14 22:34:59 +000011struct A : virtual B0 {};
Warren Huntbd1b0c62013-10-14 19:08:58 +000012
13// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000014// CHECK: *** Dumping AST Record Layout
15// CHECK-NEXT: 0 | struct A
16// CHECK-NEXT: 0 | (A vbtable pointer)
17// CHECK-NEXT: 4 | struct B0 (virtual base)
18// CHECK-NEXT: 4 | char a
19// CHECK-NEXT: | [sizeof=5, align=4
20// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000021// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000022// CHECK-X64: *** Dumping AST Record Layout
23// CHECK-X64-NEXT: 0 | struct A
24// CHECK-X64-NEXT: 0 | (A vbtable pointer)
25// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
26// CHECK-X64-NEXT: 8 | char a
27// CHECK-X64-NEXT: | [sizeof=16, align=8
28// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000029
30struct __declspec(align(1)) B : virtual B0 {};
31
32// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000033// CHECK-NEXT: 0 | struct B
34// CHECK-NEXT: 0 | (B vbtable pointer)
35// CHECK-NEXT: 4 | struct B0 (virtual base)
36// CHECK-NEXT: 4 | char a
37// CHECK-NEXT: | [sizeof=8, align=4
38// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000039// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000040// CHECK-X64-NEXT: 0 | struct B
41// CHECK-X64-NEXT: 0 | (B vbtable pointer)
42// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
43// CHECK-X64-NEXT: 8 | char a
44// CHECK-X64-NEXT: | [sizeof=16, align=8
45// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000046
47struct C : virtual B0 { int a; C() : a(0xC) {} };
48
49// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000050// CHECK-NEXT: 0 | struct C
51// CHECK-NEXT: 0 | (C vbtable pointer)
52// CHECK-NEXT: 4 | int a
53// CHECK-NEXT: 8 | struct B0 (virtual base)
54// CHECK-NEXT: 8 | char a
55// CHECK-NEXT: | [sizeof=9, align=4
56// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000057// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000058// CHECK-X64-NEXT: 0 | struct C
59// CHECK-X64-NEXT: 0 | (C vbtable pointer)
60// CHECK-X64-NEXT: 8 | int a
61// CHECK-X64-NEXT: 16 | struct B0 (virtual base)
62// CHECK-X64-NEXT: 16 | char a
63// CHECK-X64-NEXT: | [sizeof=24, align=8
64// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000065
66struct D : virtual B0 { __declspec(align(1)) int a; D() : a(0xD) {} };
67
68// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000069// CHECK-NEXT: 0 | struct D
70// CHECK-NEXT: 0 | (D vbtable pointer)
71// CHECK-NEXT: 4 | int a
72// CHECK-NEXT: 8 | struct B0 (virtual base)
73// CHECK-NEXT: 8 | char a
74// CHECK-NEXT: | [sizeof=12, align=4
75// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000076// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000077// CHECK-X64-NEXT: 0 | struct D
78// CHECK-X64-NEXT: 0 | (D vbtable pointer)
79// CHECK-X64-NEXT: 8 | int a
80// CHECK-X64-NEXT: 16 | struct B0 (virtual base)
81// CHECK-X64-NEXT: 16 | char a
82// CHECK-X64-NEXT: | [sizeof=24, align=8
83// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000084
85struct E : virtual B0, virtual B1 {};
86
87// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000088// CHECK: *** Dumping AST Record Layout
89// CHECK-NEXT: 0 | struct E
90// CHECK-NEXT: 0 | (E vbtable pointer)
91// CHECK-NEXT: 4 | struct B0 (virtual base)
92// CHECK-NEXT: 4 | char a
93// CHECK-NEXT: 5 | struct B1 (virtual base) (empty)
94// CHECK-NEXT: | [sizeof=8, align=4
95// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000096// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000097// CHECK-X64: *** Dumping AST Record Layout
98// CHECK-X64-NEXT: 0 | struct E
99// CHECK-X64-NEXT: 0 | (E vbtable pointer)
100// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
101// CHECK-X64-NEXT: 8 | char a
102// CHECK-X64-NEXT: 9 | struct B1 (virtual base) (empty)
103// CHECK-X64-NEXT: | [sizeof=16, align=8
104// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Reid Klecknerbd5bd4b2013-10-14 21:14:05 +0000105
106struct F { char a; virtual ~F(); };
107
108// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000109// CHECK-NEXT: 0 | struct F
110// CHECK-NEXT: 0 | (F vftable pointer)
111// CHECK-NEXT: 4 | char a
112// CHECK-NEXT: | [sizeof=8, align=4
113// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000114// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000115// CHECK-X64-NEXT: 0 | struct F
116// CHECK-X64-NEXT: 0 | (F vftable pointer)
117// CHECK-X64-NEXT: 8 | char a
118// CHECK-X64-NEXT: | [sizeof=16, align=8
119// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Reid Klecknerbd5bd4b2013-10-14 21:14:05 +0000120
Warren Huntbd1b0c62013-10-14 19:08:58 +0000121int a[
122sizeof(A)+
123sizeof(B)+
124sizeof(C)+
125sizeof(D)+
Reid Klecknerbd5bd4b2013-10-14 21:14:05 +0000126sizeof(E)+
127sizeof(F)];