@@ -42,6 +42,12 @@ member_offset_iterator &member_offset_iterator::operator++()
4242 current.second += bit_field_bits / 8 ;
4343 bit_field_bits %= 8 ;
4444 }
45+ else if (comp.type ().id () == ID_bool)
46+ {
47+ ++bit_field_bits;
48+ current.second += bit_field_bits / 8 ;
49+ bit_field_bits %= 8 ;
50+ }
4551 else
4652 {
4753 DATA_INVARIANT (
@@ -288,7 +294,16 @@ exprt member_offset_expr(
288294 bit_field_bits += w;
289295 const std::size_t bytes = bit_field_bits / 8 ;
290296 bit_field_bits %= 8 ;
291- result=plus_exprt (result, from_integer (bytes, result.type ()));
297+ if (bytes > 0 )
298+ result = plus_exprt (result, from_integer (bytes, result.type ()));
299+ }
300+ else if (c.type ().id () == ID_bool)
301+ {
302+ ++bit_field_bits;
303+ const std::size_t bytes = bit_field_bits / 8 ;
304+ bit_field_bits %= 8 ;
305+ if (bytes > 0 )
306+ result = plus_exprt (result, from_integer (bytes, result.type ()));
292307 }
293308 else
294309 {
@@ -315,6 +330,15 @@ exprt size_of_expr(
315330 {
316331 const auto &array_type = to_array_type (type);
317332
333+ // special-case arrays of bits
334+ if (array_type.subtype ().id () == ID_bool)
335+ {
336+ auto bits = pointer_offset_bits (array_type, ns);
337+
338+ if (bits.has_value ())
339+ return from_integer ((*bits + 7 ) / 8 , size_type ());
340+ }
341+
318342 exprt sub = size_of_expr (array_type.subtype (), ns);
319343 if (sub.is_nil ())
320344 return nil_exprt ();
@@ -335,7 +359,18 @@ exprt size_of_expr(
335359 }
336360 else if (type.id ()==ID_vector)
337361 {
338- exprt sub = size_of_expr (to_vector_type (type).subtype (), ns);
362+ const auto &vector_type = to_vector_type (type);
363+
364+ // special-case vectors of bits
365+ if (vector_type.subtype ().id () == ID_bool)
366+ {
367+ auto bits = pointer_offset_bits (vector_type, ns);
368+
369+ if (bits.has_value ())
370+ return from_integer ((*bits + 7 ) / 8 , size_type ());
371+ }
372+
373+ exprt sub = size_of_expr (vector_type.subtype (), ns);
339374 if (sub.is_nil ())
340375 return nil_exprt ();
341376
@@ -381,7 +416,16 @@ exprt size_of_expr(
381416 bit_field_bits += w;
382417 const std::size_t bytes = bit_field_bits / 8 ;
383418 bit_field_bits %= 8 ;
384- result=plus_exprt (result, from_integer (bytes, result.type ()));
419+ if (bytes > 0 )
420+ result = plus_exprt (result, from_integer (bytes, result.type ()));
421+ }
422+ else if (c.type ().id () == ID_bool)
423+ {
424+ ++bit_field_bits;
425+ const std::size_t bytes = bit_field_bits / 8 ;
426+ bit_field_bits %= 8 ;
427+ if (bytes > 0 )
428+ result = plus_exprt (result, from_integer (bytes, result.type ()));
385429 }
386430 else
387431 {
0 commit comments