On Thu, Aug 18, 2022 at 9:54 AM Eric Botcazou <[email protected]> wrote:
>
> > 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.
Hmm :/ But that means we _should_ force a sign extension but only
from ptrofftype_p ()? That is, your test above should maybe read
signop sgn = TYPE_SIGN (type);
if (ptrofftype_p (type))
sgn = SIGNED;
assuming 'type' is the type of lowbnd
> --
> Eric Botcazou
>
>