> Meh. OK, eventually would need "indirection" through a wide-int then.
> Like
>
> offset_int::from (wi::to_wide (lowbnd), TYPE_SIGN (TREE_TYPE (lowbnd)))
That would be OK if get_offset_range did the same, but it does not since it
forces a sign-extension whatever the sign of a large type:
signop sgn = SIGNED;
/* Only convert signed integers or unsigned sizetype to a signed
offset and avoid converting large positive values in narrower
types to negative offsets. */
if (TYPE_UNSIGNED (type)
&& wr[0].get_precision () < TYPE_PRECISION (sizetype))
sgn = UNSIGNED;
> I think it should extend according to sing of lowbnd? Or does Ada
> use an unsigned lowbnd to represent a signed value here? At least
> that's what I had issues with with your patch.
It uses sizetype like everyone else and the signedness was forced on it
because of the POINTER_PLUS_EXPR thing, i.e. it was signed before.
--
Eric Botcazou