mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-16 13:01:21 +08:00
PR tree-optimization/89662 - -Warray-bounds ICE on void* arithmetic
gcc/ChangeLog: PR tree-optimization/89662 * tree-vrp.c (vrp_prop::check_mem_ref): Avoid assuming every type has a size. gcc/testsuite/ChangeLog: PR tree-optimization/89662 * gcc.dg/Warray-bounds-41.c: New test. From-SVN: r269655
This commit is contained in:
parent
bd8ea48313
commit
129ef157d4
@ -1,3 +1,9 @@
|
||||
2019-03-13 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR tree-optimization/89662
|
||||
* tree-vrp.c (vrp_prop::check_mem_ref): Avoid assuming every type
|
||||
has a size.
|
||||
|
||||
2019-03-13 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/89677
|
||||
|
@ -1,3 +1,8 @@
|
||||
2019-03-13 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR tree-optimization/89662
|
||||
* gcc.dg/Warray-bounds-41.c: New test.
|
||||
|
||||
2019-03-13 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/63508
|
||||
|
33
gcc/testsuite/gcc.dg/Warray-bounds-41.c
Normal file
33
gcc/testsuite/gcc.dg/Warray-bounds-41.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* PR tree-optimization/89662- -Warray-bounds ICE on void* arithmetic
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O2 -Wall" } */
|
||||
|
||||
void* vptr (void *c)
|
||||
{
|
||||
return c;
|
||||
}
|
||||
|
||||
void sink (void*);
|
||||
|
||||
void test_vptr_arith_vla_cst (void)
|
||||
{
|
||||
int n = 1;
|
||||
char c[n];
|
||||
sink (vptr (c) - 1); /* { dg-warning "\\\[-Warray-bounds" } */
|
||||
}
|
||||
|
||||
void test_vptr_arith_vla_range (int n)
|
||||
{
|
||||
if (n < 1 || 4 < n)
|
||||
return;
|
||||
|
||||
char c[n];
|
||||
sink (vptr (c) - 1); /* { dg-warning "\\\[-Warray-bounds" "pr82608" { xfail *-*-* } } */
|
||||
}
|
||||
|
||||
void test_vptr_arith_vla_var (int n)
|
||||
{
|
||||
char c[n];
|
||||
sink (vptr (c) - 1); /* { dg-warning "\\\[-Warray-bounds" "pr82608" { xfail *-*-* } } */
|
||||
}
|
||||
|
@ -4718,13 +4718,16 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
|
||||
{
|
||||
/* Extract the element type out of MEM_REF and use its size
|
||||
to compute the index to print in the diagnostic; arrays
|
||||
in MEM_REF don't mean anything. */
|
||||
in MEM_REF don't mean anything. A type with no size like
|
||||
void is as good as having a size of 1. */
|
||||
tree type = TREE_TYPE (ref);
|
||||
while (TREE_CODE (type) == ARRAY_TYPE)
|
||||
type = TREE_TYPE (type);
|
||||
tree size = TYPE_SIZE_UNIT (type);
|
||||
offrange[0] = offrange[0] / wi::to_offset (size);
|
||||
offrange[1] = offrange[1] / wi::to_offset (size);
|
||||
if (tree size = TYPE_SIZE_UNIT (type))
|
||||
{
|
||||
offrange[0] = offrange[0] / wi::to_offset (size);
|
||||
offrange[1] = offrange[1] / wi::to_offset (size);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user