> Hmm, yeah. Or something like > > Index: expr.c > =================================================================== > --- expr.c (revision 186082) > +++ expr.c (working copy) > @@ -4490,8 +4490,8 @@ get_bit_range (unsigned HOST_WIDE_INT *b > bitoffset += (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1) > - tree_low_cst (DECL_FIELD_BIT_OFFSET (repr), 1)); > > - *bitstart = bitpos - bitoffset; > - *bitend = *bitstart + tree_low_cst (DECL_SIZE (repr), 1) - 1; > + *bitstart = bitpos < (HOST_WIDE_INT) bitoffset ? 0 : bitpos - > bitoffset; > + *bitend = bitpos + tree_low_cst (DECL_SIZE (repr), 1) - bitoffset - 1; > } > > /* Returns true if the MEM_REF REF refers to an object that does not > > which conservatively truncates the bitrange.
What do you think about allowing get_bit_range to adjust offset and bitpos? tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1, &unsignedp, &volatilep, true); if (TREE_CODE (to) == COMPONENT_REF && DECL_BIT_FIELD_TYPE (TREE_OPERAND (to, 1))) get_bit_range (&bitregion_start, &bitregion_end, &offset, &bitpos, to); so as to have a really non-negative bitregion_start/bitregion_end? It would assert that offset is already non-null in that case. -- Eric Botcazou