1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -emit-llvm-only  -triple i386-apple-darwin9 -fdump-record-layouts %s | FileCheck %s
2ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian// rdar://8823265
3ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian
4ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian#pragma pack(1)
56ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstruct _one_ms {
66ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short m:9;      // size is 2
76ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        int q:27;       // size is 6
86ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short w:13;     // size is 8
96ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short e:3;      // size is 8
106ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char r:4;       // size is 9
116ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char t:7;       // size is 10
126ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short y:16;     // size is 12
136ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short u:1;      // size is 14
146ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char i:2;       // size is 15
156ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        int a;          // size is 19
166ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char o:6;       // size is 20
176ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char s:2;       // size is 20
186ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short d:10;     // size is 22
196ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short f:4;      // size is 22
206ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char b;         // size is 23
216ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char g:1;       // size is 24
226ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        short h:13;     // size is 26
236ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char j:8;       // size is 27
246ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char k:5;       // size is 28
256ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char c;         // size is 29
266ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        int l:28;       // size is 33
276ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        char z:7;       // size is 34
286ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        int x:20;       // size is 38
296ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian} __attribute__((__ms_struct__));
306ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahaniantypedef struct _one_ms one_ms;
316ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
326ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstatic int a1[(sizeof(one_ms) == 38) - 1];
336ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
346ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian#pragma pack(2)
35ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanianstruct _two_ms {
36225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short m:9;
37225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int q:27;
38225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short w:13;
39225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short e:3;
40225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char r:4;
41225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char t:7;
42225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short y:16;
43225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short u:1;
44225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char i:2;
45225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int a;
46225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char o:6;
47225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char s:2;
48225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short d:10;
49225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short f:4;
50225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char b;
51225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char g:1;
52225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short h:13;
53225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char j:8;
54225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char k:5;
55225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char c;
56225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int l:28;
57225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char z:7;
58225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int x:20;
596ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian} __attribute__((__ms_struct__));
606ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
61ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahaniantypedef struct _two_ms two_ms;
62ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian
636ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstatic int a2[(sizeof(two_ms) == 42) - 1];
646ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
656ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian#pragma pack(4)
666ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstruct _four_ms {
67225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short m:9;
68225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int q:27;
69225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short w:13;
70225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short e:3;
71225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char r:4;
72225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char t:7;
73225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short y:16;
74225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short u:1;
75225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char i:2;
76225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int a;
77225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char o:6;
78225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char s:2;
79225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short d:10;
80225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short f:4;
81225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char b;
82225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char g:1;
83225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short h:13;
84225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char j:8;
85225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char k:5;
86225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char c;
87225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int l:28;
88225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char z:7;
89225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int x:20;
906ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian} __attribute__((__ms_struct__));
916ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahaniantypedef struct _four_ms four_ms;
926ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
936ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstatic int a4[(sizeof(four_ms) == 48) - 1];
946ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
956ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian#pragma pack(8)
966ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstruct _eight_ms {
97225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short m:9;
98225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int q:27;
99225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short w:13;
100225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short e:3;
101225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char r:4;
102225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char t:7;
103225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short y:16;
104225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short u:1;
105225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char i:2;
106225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int a;
107225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char o:6;
108225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char s:2;
109225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short d:10;
110225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short f:4;
111225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char b;
112225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char g:1;
113225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        short h:13;
114225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char j:8;
115225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char k:5;
116225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char c;
117225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int l:28;
118225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        char z:7;
119225c5dda5a9c85b7bee5d955875e239f70924f74Fariborz Jahanian        int x:20;
1206ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian} __attribute__((__ms_struct__));
1216ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
1226ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahaniantypedef struct _eight_ms eight_ms;
1236ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
1246ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanianstatic int a8[(sizeof(eight_ms) == 48) - 1];
1256ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// rdar://15926990
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#pragma pack(2)
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct test0 {
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned long a : 8;
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned long b : 8;
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned long c : 8;
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned long d : 10;
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned long e : 1;
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} __attribute__((__ms_struct__));
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK:      Type: struct test0
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: Record:
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: Layout:
139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT:   Size:64
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT:   DataSize:64
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT:   Alignment:16
142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT:   FieldOffsets: [0, 8, 16, 32, 42]>
143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic int test0[(sizeof(struct test0) == 8) ? 1 : -1];
145