Commit 56735d40 by Martin Sebor Committed by Martin Sebor

PR bootstrap/83446 - Bootstrap failed on i686

gcc/testsuite/ChangeLog:

	PR bootstrap/83446
	* c-c++-common/Warray-bounds-3.c: Adjust.
	* gcc.dg/Warray-bounds-25.c: New test.

gcc/ChangeLog:

	PR bootstrap/83446
	* gimple-ssa-warn-restrict.c
	(builtin_memref::offset_out_of_bounds): Correct the handling of
	anti-ranges.

From-SVN: r255772
parent bfecb9de
2017-12-17 Martin Sebor <msebor@redhat.com>
PR bootstrap/83446
* gimple-ssa-warn-restrict.c
(builtin_memref::offset_out_of_bounds): Correct the handling of
anti-ranges.
2017-12-17 Sandra Loosemore <sandra@codesourcery.com> 2017-12-17 Sandra Loosemore <sandra@codesourcery.com>
* doc/invoke.texi (ARC Options): Add missing -mlra entry. * doc/invoke.texi (ARC Options): Add missing -mlra entry.
...@@ -413,7 +413,9 @@ builtin_memref::offset_out_of_bounds (int strict, offset_int ooboff[2]) const ...@@ -413,7 +413,9 @@ builtin_memref::offset_out_of_bounds (int strict, offset_int ooboff[2]) const
if (DECL_P (base) && TREE_CODE (TREE_TYPE (base)) == ARRAY_TYPE) if (DECL_P (base) && TREE_CODE (TREE_TYPE (base)) == ARRAY_TYPE)
{ {
if (offrng[1] < offrng[0]) /* Check for offset in an anti-range with a negative lower bound.
For such a range, consider only the non-negative subrange. */
if (offrng[1] < offrng[0] && offrng[1] < 0)
offrng[1] = maxobjsize; offrng[1] = maxobjsize;
} }
......
...@@ -123,8 +123,11 @@ void test_memcpy_bounds_anti_range (char *d, const char *s, size_t n) ...@@ -123,8 +123,11 @@ void test_memcpy_bounds_anti_range (char *d, const char *s, size_t n)
(yet). */ (yet). */
T (char, 9, a, a + SAR ( 1, 6), 3); /* { dg-warning "forming offset \\\[9, 0] is out of the bounds \\\[0, 9] of object " "memcpy" { xfail *-*-* } } */ T (char, 9, a, a + SAR ( 1, 6), 3); /* { dg-warning "forming offset \\\[9, 0] is out of the bounds \\\[0, 9] of object " "memcpy" { xfail *-*-* } } */
T (char, 9, a, a + SAR ( 2, 6), 3); /* { dg-warning "forming offset 10 is out of the bounds \\\[0, 9] of object " "memcpy" } */ /* The range of offsets is the union of [0, 1] and [7, PTRDIFF_MAX]
T (char, 9, a, a + SAR ( 3, 6), 3); /* { dg-warning "forming offset 10 is out of the bounds \\\[0, 9] of object " "memcpy" } */ of which the first subrange is valid and thus no warming for memcpy
is issued. Similarly for the next test. */
T (char, 9, a, a + SAR ( 2, 6), 3);
T (char, 9, a, a + SAR ( 3, 6), 3);
T (char, 9, a, a + SAR (-1, 7), 3); /* { dg-warning "forming offset \\\[10, 11] is out of the bounds \\\[0, 9] of object " "memcpy" } */ T (char, 9, a, a + SAR (-1, 7), 3); /* { dg-warning "forming offset \\\[10, 11] is out of the bounds \\\[0, 9] of object " "memcpy" } */
T (char, 9, a, a + SAR (-2, 8), 3); /* { dg-warning "forming offset \\\[10, 12] is out of the bounds \\\[0, 9] of object " "memcpy" } */ T (char, 9, a, a + SAR (-2, 8), 3); /* { dg-warning "forming offset \\\[10, 12] is out of the bounds \\\[0, 9] of object " "memcpy" } */
......
/* PR tree-optimization/83446 - Bootstrap failed on i686
{ dg-do compile }
{ dg-options "-O2 -Warray-bounds" } */
char a[4];
void f0i (void *d, int n)
{
if (n < 0) n = 0;
__builtin_memcpy (d, a + sizeof a - n, n);
}
void f0L (void *d, long n)
{
if (n < 0) n = 0;
__builtin_memcpy (d, a + sizeof a - n, n);
}
void f0u (void *d, unsigned n)
{
if (n < 0) n = 1;
__builtin_memcpy (d, a + sizeof a - n, n); /* { dg-bogus "\\\[-Warray-bounds" } */
}
void f1lu (void *d, unsigned long n)
{
if (n < 1) n = 1;
__builtin_memcpy (d, a + sizeof a - n, n); /* { dg-bogus "\\\[-Warray-bounds" } */
}
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