1// RUN: %clang_cc1 -w -fdump-record-layouts %s 2> %t.layouts
2// RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.before 2>&1
3// RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after 2>&1
4// RUN: diff %t.before %t.after
5// RUN: FileCheck %s < %t.after
6
7// If not explicitly disabled, set PACKED to the packed attribute.
8#ifndef PACKED
9#  define PACKED __attribute__((packed))
10#endif
11
12// If not explicitly disabled, set ALIGNED16 to 16-byte alignment.
13#ifndef ALIGNED16
14#  define ALIGNED16 __attribute__((aligned(16)))
15#endif
16
17// CHECK: Type: struct X0
18struct X0 {
19  int x[6] PACKED;
20};
21
22// CHECK: Type: struct X1
23struct X1 {
24  char x[13];
25  struct X0 y;
26} PACKED;
27
28// CHECK: Type: struct X2
29struct PACKED X2 {
30  short x;
31  int y;
32};
33
34// CHECK: Type: struct X3
35struct X3 {
36  short x PACKED;
37  int y;
38};
39
40#pragma pack(push,2)
41// CHECK: Type: struct X4
42struct X4 {
43  int x;
44  int y;
45};
46#pragma pack(pop)
47
48// CHECK: Type: struct X5
49struct PACKED X5 { double a[19];  signed char b; };
50
51// CHECK: Type: struct X6
52struct PACKED X6 { long double a; char b; };
53
54// CHECK: Type: struct X7
55struct X7 {
56        unsigned x;
57        unsigned char y;
58} PACKED;
59
60// CHECK: Type: union X8
61union X8 {
62  struct X7 x;
63  unsigned y;
64} PACKED;
65
66// CHECK: Type: struct X9
67struct X9 {
68  unsigned int x[2] PACKED;
69  unsigned int y;
70  unsigned int z PACKED;
71};
72
73// CHECK: Type: struct X10
74struct X10 {
75  unsigned int x[2] PACKED;
76  unsigned int y PACKED;
77  unsigned int z PACKED;
78};
79
80// CHECK: Type: struct X11
81struct PACKED X11 {
82  unsigned int x[2];
83  unsigned int y;
84  unsigned int z;
85};
86
87// CHECK: Type: struct X12
88struct PACKED X12 {
89  int x : 24;
90};
91
92// CHECK: Type: struct X13
93struct PACKED X13 {
94  signed x : 10;
95  signed y : 10;
96};
97
98// CHECK: Type: union X14
99union PACKED X14 {
100  unsigned long long x : 3;
101};
102
103// CHECK: Type: struct X15
104struct X15 {
105  unsigned x : 16;
106  unsigned y : 28 PACKED;
107};
108
109// CHECK: Type: struct X16
110struct ALIGNED16 X16 {
111  int a, b, c;
112  int x : 5;
113  int y : 29;
114};
115
116void use_structs() {
117  struct X0 x0;
118  x0.x[5] = sizeof(struct X0);
119
120  struct X1 x1;
121  x1.x[5] = sizeof(struct X1);
122
123  struct X2 x2;
124  x2.y = sizeof(struct X2);
125
126  struct X3 x3;
127  x3.y = sizeof(struct X3);
128
129  struct X4 x4;
130  x4.y = sizeof(struct X4);
131
132  struct X5 x5;
133  x5.b = sizeof(struct X5);
134
135  struct X6 x6;
136  x6.b = sizeof(struct X6);
137
138  struct X7 x7;
139  typedef int X7array[sizeof(struct X7)];
140  x7.x = sizeof(struct X7);
141  x7.y = x7.x;
142
143  union X8 x8;
144  typedef int X8array[sizeof(union X8)];
145  x8.y = sizeof(union X8);
146  x8.x.x = x8.y;
147
148  struct X9 x9;
149  typedef int X9array[sizeof(struct X9)];
150  x9.y = sizeof(struct X9);
151
152  struct X10 x10;
153  typedef int X10array[sizeof(struct X10)];
154  x10.y = sizeof(struct X10);
155
156  struct X11 x11;
157  typedef int X11array[sizeof(struct X11)];
158  x11.y = sizeof(struct X11);
159
160  struct X12 x12;
161  x12.x = sizeof(struct X12);
162
163  struct X13 x13;
164  x13.x = sizeof(struct X13);
165
166  union X14 x14;
167  x14.x = sizeof(union X14);
168
169  struct X15 x15;
170  x15.x = sizeof(struct X15);
171
172  struct X16 x16;
173  x16.x = sizeof(struct X16);
174}
175