On Mon, 4 Aug 2014, Marc Glisse wrote:
> On Mon, 4 Aug 2014, Marek Polacek wrote:
>
> > +/* { dg-do compile } */
> > +
> > +void
> > +foo (void)
> > +{
> > + volatile __PTRDIFF_TYPE__ t;
> > + int i;
> > + int *p = &i;
> > + int *q = &i + 1;
> > + t = q - (q - 1);
> > + t = (q - 1) - q; /* { dg-warning "integer overflow in expression" } */
> > + t = p - (p - 1);
> > + t = (p - 1) - p ; /* { dg-warning "integer overflow in expression" } */
> > +}
>
> Why do you want a warning for (q - 1) - q ? It looks like a perfectly correct
> way to say -1 to me (ptrdiff_t is a signed type for a reason).
But computing &object - 1 does not result in a valid pointer,
so p - 1 is what we want to warn about? OTOH (q - 1) - q is fine.
Indeed that POINTER_PLUS_EXPR has an unsigned offset is an implementation
detail.
Richard.