1 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=i686-apple-darwin9
2 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=arm-linux-gnueabihf
3 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=aarch64-linux-gnu
4 // RUN: %clang_cc1 %s -fsyntax-only -verify -triple=x86_64-pc-linux-gnu
5 // expected-no-diagnostics
6 
7 #define CHECK_SIZE(name, size) \
8   extern int name##_1[sizeof(name) == size ? 1 : -1];
9 
10 
11 struct  __attribute__((packed)) {
12   int a;
13   int b : 4;
14   int c : 32;
15 } s0;
16 CHECK_SIZE(s0,9)
17 
18 #pragma pack (1)
19 struct {
20   int a;
21   int b : 4;
22   int c : 32;
23 } s1;
24 CHECK_SIZE(s1,9)
25 
26 #pragma pack (2)
27 struct {
28   int a;
29   int b : 4;
30   int c : 32;
31 } s2;
32 CHECK_SIZE(s2,10)
33 
34 #pragma pack (2)
35 struct __attribute__((packed)) {
36   int a;
37   int b : 4;
38   int c : 32;
39 } s3;
40 CHECK_SIZE(s3,10)
41 
42 #pragma pack (4)
43 struct  __attribute__((packed)) {
44   int a;
45   int b : 4;
46   int c : 32;
47 } s4;
48 CHECK_SIZE(s4,12)
49 
50 #pragma pack (16)
51 struct {
52   int a;
53   int __attribute__((packed)) b : 4;
54   int __attribute__((packed)) c : 32;
55 } s41;
56 CHECK_SIZE(s41,12)
57 
58 #pragma pack (16)
59 struct {
60   int a;
61   int b : 4;
62   int c : 32;
63 } s5;
64 CHECK_SIZE(s5,12)
65 
66 #pragma pack (1)
67 struct  __attribute__((aligned(4))) {
68   int a;
69   int b : 4;
70   int c : 32;
71 } s6;
72 CHECK_SIZE(s6,12)
73 
74 #pragma pack (2)
75 struct {
76   char a;
77   int b : 4;
78   int c : 32;
79   char s;
80 } s7;
81 CHECK_SIZE(s7,8)
82 
83 #pragma pack (1)
84 struct {
85   char a;
86   int b : 4;
87   int c : 28;
88   char s;
89 } s8;
90 CHECK_SIZE(s8,6)
91 
92 #pragma pack (8)
93 struct {
94   char a;
95   int b : 4;
96   int c : 28;
97   char s;
98 } s9;
99 CHECK_SIZE(s9,8)
100 
101 #pragma pack (8)
102 struct {
103   char a;
104   char s;
105 } s10;
106 CHECK_SIZE(s10,2)
107 
108 #pragma pack(4)
109 struct {
110   char a;
111   int b : 4;
112   int c : 28;
113   char s1;
114   char s2;
115   char s3;
116 } s11;
117 CHECK_SIZE(s11,8)
118 
119 #pragma pack(4)
120 struct {
121   short s1;
122   int a1 : 17;
123   int a2 : 17;
124   int a3 : 30;
125   short s2;
126 } s12;
127 CHECK_SIZE(s12,12)
128 
129 #pragma pack(4)
130 struct {
131   char c1;
132   int i1 : 17;
133   int i2 : 17;
134   int i3 : 30;
135   char c2;
136 } s13;
137 CHECK_SIZE(s13,12)
138 
139 #pragma pack(2)
140 struct {
141   char a;
142   int s;
143 } s14;
144 CHECK_SIZE(s14,6)
145 
146 #pragma pack(4)
147 struct {
148   char a;
149   short s;
150 } s15;
151 CHECK_SIZE(s15,4)
152 
153 #pragma pack(2)
154 struct {
155   char a;
156   int b : 4;
157   int c : 28;
158   char s1;
159   char s2;
160   char s3;
161 } s16;
162 CHECK_SIZE(s16,8)
163 
164 #pragma pack (16)
165 struct {
166   int __attribute__((packed)) a;
167   int __attribute__((packed)) b : 4;
168   int __attribute__((packed)) c : 32;
169 } s17;
170 CHECK_SIZE(s17,12)
171 
172 #pragma pack (16)
173 struct {
174   int __attribute__((aligned(8))) a;
175   int __attribute__((aligned(8))) b : 4;
176   int __attribute__((aligned(8))) c : 32;
177 } s18;
178 CHECK_SIZE(s18,24)
179 
180 #pragma pack (16)
181 struct {
182   int __attribute__((aligned(1))) a;
183   int __attribute__((aligned(1))) b : 4;
184   int __attribute__((aligned(1))) c : 32;
185 } s19;
186 CHECK_SIZE(s19,12)
187 
188 #pragma pack (1)
189 struct  __attribute__((aligned(8))) {
190   int a;
191   int b : 4;
192   int c : 32;
193 } s20;
194 CHECK_SIZE(s20,16)
195 
196 #pragma pack (2)
197 struct {
198   int __attribute__((aligned(8))) a;
199   int __attribute__((aligned(8))) b : 4;
200   int __attribute__((aligned(8))) c : 32;
201 } s21;
202 CHECK_SIZE(s21,10)
203