1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \
2// RUN:            | FileCheck %s
3// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts %s 2>/dev/null \
4// RUN:            | FileCheck %s -check-prefix CHECK-X64
5
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 { char a; B0() : a(0xB0) {} };
9struct __declspec(align(1)) B1 {};
10
11struct A : virtual B0 {};
12
13// CHECK: *** Dumping AST Record Layout
14// 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]
21// CHECK-X64: *** Dumping AST Record Layout
22// 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]
29
30struct __declspec(align(1)) B : virtual B0 {};
31
32// CHECK: *** Dumping AST Record Layout
33// 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]
39// CHECK-X64: *** Dumping AST Record Layout
40// 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]
46
47struct C : virtual B0 { int a; C() : a(0xC) {} };
48
49// CHECK: *** Dumping AST Record Layout
50// 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]
57// CHECK-X64: *** Dumping AST Record Layout
58// 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]
65
66struct D : virtual B0 { __declspec(align(1)) int a; D() : a(0xD) {} };
67
68// CHECK: *** Dumping AST Record Layout
69// 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]
76// CHECK-X64: *** Dumping AST Record Layout
77// 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]
84
85struct E : virtual B0, virtual B1 {};
86
87// CHECK: *** Dumping AST Record Layout
88// 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]
96// CHECK-X64: *** Dumping AST Record Layout
97// 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]
105
106struct F { char a; virtual ~F(); };
107
108// CHECK: *** Dumping AST Record Layout
109// 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]
114// CHECK-X64: *** Dumping AST Record Layout
115// 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]
120
121int a[
122sizeof(A)+
123sizeof(B)+
124sizeof(C)+
125sizeof(D)+
126sizeof(E)+
127sizeof(F)];
128