89 testBitfieldSizeof(void)
91 /* Although bitfields are extremely implementation dependant, these
92 assertions should hold for all implementations with storage units
93 of 8 bits or larger (nearly universal).
95 ASSERT( sizeof(size1a_bf) >= 1);
96 ASSERT( sizeof(size1b_bf) >= 1);
97 ASSERT( sizeof(size1c_bf) >= 1);
98 #if !defined (__amd64__) && !defined(__CYGWIN32__) && !defined(__MINGW32__)
99 /* assertion fails on amd64, cygwin and mingw.
100 Maybe it depends on gcc version?
102 ASSERT( sizeof(size2a_bf) >= 2);
104 ASSERT( sizeof(size2b_bf) >= 2);
105 ASSERT( sizeof(size2c_bf) >= 2);
106 ASSERT( sizeof(size2d_bf) >= 2);
107 ASSERT( sizeof(size3a_bf) >= 2);
108 ASSERT( sizeof(size1a_bf) <= sizeof(size1b_bf));
109 #if !defined (__amd64__) && !defined(__CYGWIN32__) && !defined(__MINGW32__)
110 /* assertion fails on amd64, cygwin and mingw.
111 Maybe it depends on gcc version?
113 ASSERT( sizeof(size1a_bf) < sizeof(size2a_bf));
116 /* Some SDCC specific assertions. SDCC uses 8 bit storage units.
117 Bitfields that are less than 8 bits, but would (due to earlier
118 bitfield declarations) span a storage unit boundary are
119 realigned to the next storage unit boundary. Bitfields of
120 8 or greater bits are always aligned to start on a storage
124 ASSERT( sizeof(size1a_bf) == 1);
125 ASSERT( sizeof(size1b_bf) == 1);
126 ASSERT( sizeof(size1c_bf) == 1);
127 ASSERT( sizeof(size2a_bf) == 2);
128 ASSERT( sizeof(size2b_bf) == 2);
129 ASSERT( sizeof(size2c_bf) == 2);
130 ASSERT( sizeof(size2d_bf) == 2);
131 ASSERT( sizeof(size3a_bf) == 3);
137 testBitfieldsSingleBitLiteral(void)
150 /* make sure modulo 2 truncation works */
151 size2b_bf.b0 = 0x3fe;
152 ASSERT(size2b_bf.b0==0);
153 ASSERT(size2b_bf.b1==0);
154 ASSERT(size2b_bf.b2==0);
155 ASSERT(size2b_bf.b3==0);
156 ASSERT(size2b_bf.b4==0);
157 ASSERT(size2b_bf.b5==0);
158 ASSERT(size2b_bf.b6==0);
159 ASSERT(size2b_bf.b7==0);
160 ASSERT(size2b_bf.b8==0);
161 ASSERT(size2b_bf.b9==0);
162 size2b_bf.b0 = 0x3ff;
163 ASSERT(size2b_bf.b0==1);
164 ASSERT(size2b_bf.b1==0);
165 ASSERT(size2b_bf.b2==0);
166 ASSERT(size2b_bf.b3==0);
167 ASSERT(size2b_bf.b4==0);
168 ASSERT(size2b_bf.b5==0);
169 ASSERT(size2b_bf.b6==0);
170 ASSERT(size2b_bf.b7==0);
171 ASSERT(size2b_bf.b8==0);
172 ASSERT(size2b_bf.b9==0);
174 /* make sure both bytes work */
175 size2b_bf.b9 = 0x3ff;
176 ASSERT(size2b_bf.b0==1);
177 ASSERT(size2b_bf.b1==0);
178 ASSERT(size2b_bf.b2==0);
179 ASSERT(size2b_bf.b3==0);
180 ASSERT(size2b_bf.b4==0);
181 ASSERT(size2b_bf.b5==0);
182 ASSERT(size2b_bf.b6==0);
183 ASSERT(size2b_bf.b7==0);
184 ASSERT(size2b_bf.b8==0);
185 ASSERT(size2b_bf.b9==1);
189 testBitfieldsSingleBit(void)
191 volatile unsigned char c;
205 /* make sure modulo 2 truncation works */
208 ASSERT(size2b_bf.b0==0);
209 ASSERT(size2b_bf.b1==0);
210 ASSERT(size2b_bf.b2==0);
211 ASSERT(size2b_bf.b3==0);
212 ASSERT(size2b_bf.b4==0);
213 ASSERT(size2b_bf.b5==0);
214 ASSERT(size2b_bf.b6==0);
215 ASSERT(size2b_bf.b7==0);
216 ASSERT(size2b_bf.b8==0);
217 ASSERT(size2b_bf.b9==0);
220 ASSERT(size2b_bf.b0==1);
221 ASSERT(size2b_bf.b1==0);
222 ASSERT(size2b_bf.b2==0);
223 ASSERT(size2b_bf.b3==0);
224 ASSERT(size2b_bf.b4==0);
225 ASSERT(size2b_bf.b5==0);
226 ASSERT(size2b_bf.b6==0);
227 ASSERT(size2b_bf.b7==0);
228 ASSERT(size2b_bf.b8==0);
229 ASSERT(size2b_bf.b9==0);
231 /* make sure both bytes work */
233 ASSERT(size2b_bf.b0==1);
234 ASSERT(size2b_bf.b1==0);
235 ASSERT(size2b_bf.b2==0);
236 ASSERT(size2b_bf.b3==0);
237 ASSERT(size2b_bf.b4==0);
238 ASSERT(size2b_bf.b5==0);
239 ASSERT(size2b_bf.b6==0);
240 ASSERT(size2b_bf.b7==0);
241 ASSERT(size2b_bf.b8==0);
242 ASSERT(size2b_bf.b9==1);
246 testBitfieldsMultibitLiteral(void)
248 size2c_bf.b0 = 0xff; /* should truncate to 0x0f */
250 ASSERT(size2c_bf.b0==0x0f);
251 ASSERT(size2c_bf.b1==0);
253 size2c_bf.b1 = 0xff; /* should truncate to 0x1f */
255 ASSERT(size2c_bf.b0==0);
256 ASSERT(size2c_bf.b1==0x1f);
258 size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */
260 ASSERT(size2d_bf.b0==0x0fff);
261 ASSERT(size2d_bf.b1==0);
263 size2d_bf.b1 = 0xffff; /* should truncate to 0x07 */
265 ASSERT(size2d_bf.b0==0);
266 ASSERT(size2d_bf.b1==0x07);
268 size2d_bf.b0 = 0x0321;
270 ASSERT(size2d_bf.b0==0x0321);
271 ASSERT(size2d_bf.b1==1);
273 size2d_bf.b0 = 0x0a46;
275 ASSERT(size2d_bf.b0==0x0a46);
276 ASSERT(size2d_bf.b1==5);
280 testBitfieldsMultibit(void)
282 volatile int allones = 0xffff;
283 volatile int zero = 0;
286 size2c_bf.b0 = allones; /* should truncate to 0x0f */
288 ASSERT(size2c_bf.b0==0x0f);
289 ASSERT(size2c_bf.b1==0);
291 size2c_bf.b1 = allones; /* should truncate to 0x1f */
293 ASSERT(size2c_bf.b0==0);
294 ASSERT(size2c_bf.b1==0x1f);
296 size2d_bf.b0 = allones; /* should truncate to 0x0fff */
298 ASSERT(size2d_bf.b0==0x0fff);
299 ASSERT(size2d_bf.b1==0);
301 size2d_bf.b1 = allones; /* should truncate to 0x07 */
303 ASSERT(size2d_bf.b0==0);
304 ASSERT(size2d_bf.b1==0x07);
310 ASSERT(size2d_bf.b0==0x0321);
311 ASSERT(size2d_bf.b1==1);
317 ASSERT(size2d_bf.b0==0x0a46);
318 ASSERT(size2d_bf.b1==5);
327 ASSERT(*(char *)(&c_bitfield) == (2 + (3<<3)) );
329 i_bitfield.i0_7 = 23;
330 i_bitfield.i7_9 = 234;
331 ASSERT(*(int *)(&i_bitfield) == (23 + (234<<7)) );
333 l_bitfield.l0_7 = 23;
334 l_bitfield.l7_10 = 234;
335 l_bitfield.l17_15 = 2345;
336 ASSERT(*(long *)(&l_bitfield) == (23 + (234<<7) + (2345<<17)) );