On Mon, Aug 04, 2014 at 12:51:06PM +0200, Richard Biener wrote: > 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). It's not that I want the warning there. I can probably drop the two lines from the test.
> 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. I'm inclined to think that we shouldn't issue the warning at all, note how it talks about "integer overflow", but this is pointer arithmetic. We can't really decide at that point whether the pointer is valid I'm afraid. Marek