Clang Project

clang_source_code/test/CodeGen/ms_struct-pack.c
1// RUN: %clang_cc1 -emit-llvm-only  -triple i386-apple-darwin9 -fdump-record-layouts %s | FileCheck %s
2// rdar://8823265
3
4#pragma pack(1)
5struct _one_ms {
6        short m:9;      // size is 2
7        int q:27;       // size is 6
8        short w:13;     // size is 8
9        short e:3;      // size is 8
10        char r:4;       // size is 9
11        char t:7;       // size is 10
12        short y:16;     // size is 12
13        short u:1;      // size is 14
14        char i:2;       // size is 15
15        int a;          // size is 19
16        char o:6;       // size is 20
17        char s:2;       // size is 20
18        short d:10;     // size is 22
19        short f:4;      // size is 22
20        char b;         // size is 23
21        char g:1;       // size is 24
22        short h:13;     // size is 26
23        char j:8;       // size is 27
24        char k:5;       // size is 28
25        char c;         // size is 29
26        int l:28;       // size is 33
27        char z:7;       // size is 34
28        int x:20;       // size is 38
29} __attribute__((__ms_struct__));
30typedef struct _one_ms one_ms;
31
32static int a1[(sizeof(one_ms) == 38) - 1];
33
34#pragma pack(2)
35struct _two_ms {
36        short m:9;      
37        int q:27;       
38        short w:13;     
39        short e:3;      
40        char r:4;       
41        char t:7;       
42        short y:16;     
43        short u:1;      
44        char i:2;       
45        int a;          
46        char o:6;       
47        char s:2;       
48        short d:10;     
49        short f:4;      
50        char b;         
51        char g:1;       
52        short h:13;     
53        char j:8;       
54        char k:5;       
55        char c;         
56        int l:28;       
57        char z:7;       
58        int x:20;       
59} __attribute__((__ms_struct__));
60
61typedef struct _two_ms two_ms;
62
63static int a2[(sizeof(two_ms) == 42) - 1];
64
65#pragma pack(4)
66struct _four_ms {
67        short m:9;      
68        int q:27;       
69        short w:13;     
70        short e:3;      
71        char r:4;       
72        char t:7;       
73        short y:16;     
74        short u:1;      
75        char i:2;       
76        int a;          
77        char o:6;       
78        char s:2;       
79        short d:10;     
80        short f:4;      
81        char b;         
82        char g:1;       
83        short h:13;     
84        char j:8;       
85        char k:5;       
86        char c;         
87        int l:28;       
88        char z:7;       
89        int x:20;       
90} __attribute__((__ms_struct__));
91typedef struct _four_ms four_ms;
92
93static int a4[(sizeof(four_ms) == 48) - 1];
94
95#pragma pack(8)
96struct _eight_ms {
97        short m:9;      
98        int q:27;       
99        short w:13;     
100        short e:3;      
101        char r:4;       
102        char t:7;       
103        short y:16;     
104        short u:1;      
105        char i:2;       
106        int a;          
107        char o:6;       
108        char s:2;       
109        short d:10;     
110        short f:4;      
111        char b;         
112        char g:1;       
113        short h:13;     
114        char j:8;       
115        char k:5;       
116        char c;         
117        int l:28;       
118        char z:7;       
119        int x:20;       
120} __attribute__((__ms_struct__));
121
122typedef struct _eight_ms eight_ms;
123
124static int a8[(sizeof(eight_ms) == 48) - 1];
125
126// rdar://15926990
127#pragma pack(2)
128struct test0 {
129  unsigned long a : 8;
130  unsigned long b : 8;
131  unsigned long c : 8;
132  unsigned long d : 10;
133  unsigned long e : 1;
134} __attribute__((__ms_struct__));
135
136// CHECK:             0 | struct test0
137// CHECK-NEXT:    0:0-7 |   unsigned long a
138// CHECK-NEXT:    1:0-7 |   unsigned long b
139// CHECK-NEXT:    2:0-7 |   unsigned long c
140// CHECK-NEXT:    4:0-9 |   unsigned long d
141// CHECK-NEXT:    5:2-2 |   unsigned long e
142// CHECK-NEXT:          | [sizeof=8, align=2]
143
144static int test0[(sizeof(struct test0) == 8) ? 1 : -1];
145