Commit 8ae43881 by Jakub Jelinek Committed by Jakub Jelinek

re PR c/61240 (Incorrect warning "integer overflow in expression" on pointer-pointer subtraction)

	PR c/61240
	* match.pd ((P + A) - P, P - (P + A), (P + A) - (P + B)): For
	pointer_diff optimizations use view_convert instead of convert.

	* gcc.dg/pr61240.c: New test.

From-SVN: r256838
parent fcf79237
2018-01-18 Jakub Jelinek <jakub@redhat.com>
PR c/61240
* match.pd ((P + A) - P, P - (P + A), (P + A) - (P + B)): For
pointer_diff optimizations use view_convert instead of convert.
2018-01-17 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000.md (*call_indirect_nonlocal_sysv<mode>):
......
......@@ -1832,7 +1832,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* The second argument of pointer_plus must be interpreted as signed, and
thus sign-extended if necessary. */
(with { tree stype = signed_type_for (TREE_TYPE (@1)); }
(convert (convert:stype @1))))
/* Use view_convert instead of convert here, as POINTER_PLUS_EXPR
second arg is unsigned even when we need to consider it as signed,
we don't want to diagnose overflow here. */
(convert (view_convert:stype @1))))
/* (T)P - (T)(P + A) -> -(T) A */
(simplify
......@@ -1876,7 +1879,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* The second argument of pointer_plus must be interpreted as signed, and
thus sign-extended if necessary. */
(with { tree stype = signed_type_for (TREE_TYPE (@1)); }
(negate (convert (convert:stype @1)))))
/* Use view_convert instead of convert here, as POINTER_PLUS_EXPR
second arg is unsigned even when we need to consider it as signed,
we don't want to diagnose overflow here. */
(negate (convert (view_convert:stype @1)))))
/* (T)(P + A) - (T)(P + B) -> (T)A - (T)B */
(simplify
......@@ -1927,7 +1933,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* The second argument of pointer_plus must be interpreted as signed, and
thus sign-extended if necessary. */
(with { tree stype = signed_type_for (TREE_TYPE (@1)); }
(minus (convert (convert:stype @1)) (convert (convert:stype @2)))))))
/* Use view_convert instead of convert here, as POINTER_PLUS_EXPR
second arg is unsigned even when we need to consider it as signed,
we don't want to diagnose overflow here. */
(minus (convert (view_convert:stype @1))
(convert (view_convert:stype @2)))))))
/* Simplifications of MIN_EXPR, MAX_EXPR, fmin() and fmax(). */
......
2018-01-18 Jakub Jelinek <jakub@redhat.com>
PR c/61240
* gcc.dg/pr61240.c: New test.
2018-01-17 Harald Anlauf <anlauf@gmx.de>
PR fortran/83864
......
/* PR c/61240 */
/* { dg-do compile } */
typedef __PTRDIFF_TYPE__ ptrdiff_t;
ptrdiff_t
foo (ptrdiff_t a[4])
{
int i[4];
int *p = i + 2;
static ptrdiff_t b = p - (p - 1); /* { dg-bogus "integer overflow in expression" } */
static ptrdiff_t c = (p - 1) - p; /* { dg-bogus "integer overflow in expression" } */
static ptrdiff_t d = (p - 2) - (p - 1);/* { dg-bogus "integer overflow in expression" } */
static ptrdiff_t e = (p - 1) - (p - 2);/* { dg-bogus "integer overflow in expression" } */
a[0] = p - (p - 1); /* { dg-bogus "integer overflow in expression" } */
a[1] = (p - 1) - p; /* { dg-bogus "integer overflow in expression" } */
a[2] = (p - 2) - (p - 1); /* { dg-bogus "integer overflow in expression" } */
a[3] = (p - 1) - (p - 2); /* { dg-bogus "integer overflow in expression" } */
return b + c + d + e;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment