On Mon, 4 Aug 2014, Marek Polacek wrote:
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.
Well, no, I think we want those two lines, but to test that there is *no*
warning. The bug is only halfway fixed if we still warn for (q-1)-q. But
maybe you are trying to split the fix in 2 patches, in which case I don't
really mind what the intermediate status is.
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.
Richard is talking about a new, unrelated warning, that would warn for
&obj-1. That seems doable. Though warning for p-1 when p is defined as
&obj sounds much harder in the front-end.
--
Marc Glisse