On Thu, Aug 18, 2022 at 9:54 AM Eric Botcazou <botca...@adacore.com> 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
>
>

Reply via email to