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.