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
This commit is contained in:
parent
fcf7923742
commit
8ae438811f
4 changed files with 44 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
|||
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>):
|
||||
|
|
16
gcc/match.pd
16
gcc/match.pd
|
@ -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(). */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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
|
||||
|
|
20
gcc/testsuite/gcc.dg/pr61240.c
Normal file
20
gcc/testsuite/gcc.dg/pr61240.c
Normal file
|
@ -0,0 +1,20 @@
|
|||
/* 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue