mirror of git://gcc.gnu.org/git/gcc.git
PR tree-optimization/86741 - ICE in -Warray-bounds indexing into an object of incomplete type
gcc/ChangeLog: PR tree-optimization/86741 * tree-vrp.c (vrp_prop::check_mem_ref): Avoid incomplete types. gcc/testsuite/ChangeLog: PR tree-optimization/86741 * gcc.dg/Warray-bounds-33.c: New test. From-SVN: r263166
This commit is contained in:
parent
4de3a1e16a
commit
8e73e6140d
|
|
@ -1,3 +1,8 @@
|
||||||
|
2018-07-31 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/86741
|
||||||
|
* tree-vrp.c (vrp_prop::check_mem_ref): Avoid incomplete types.
|
||||||
|
|
||||||
2018-07-31 Andreas Krebbel <krebbel@linux.ibm.com>
|
2018-07-31 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||||
|
|
||||||
* config/s390/s390.c (s390_expand_setmem): Make the unrolling to
|
* config/s390/s390.c (s390_expand_setmem): Make the unrolling to
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2018-07-31 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/86741
|
||||||
|
* gcc.dg/Warray-bounds-33.c: New test.
|
||||||
|
|
||||||
2018-07-31 Andreas Krebbel <krebbel@linux.ibm.com>
|
2018-07-31 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||||
|
|
||||||
* gcc.target/s390/memset-1.c: Improve testcase.
|
* gcc.target/s390/memset-1.c: Improve testcase.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* PR tree-optimization/86741 - ICE in -Warray-bounds indexing into
|
||||||
|
an object of incomplete type
|
||||||
|
{ dg-do compile }
|
||||||
|
{ dg-options "-O2 -Wall" } */
|
||||||
|
|
||||||
|
struct S
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
};
|
||||||
|
|
||||||
|
void f (void);
|
||||||
|
|
||||||
|
void test_void (void)
|
||||||
|
{
|
||||||
|
extern void v;
|
||||||
|
struct S *b = (struct S*)&v;
|
||||||
|
if (b->s)
|
||||||
|
f ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_incomplete_enum (void)
|
||||||
|
{
|
||||||
|
extern enum E e;
|
||||||
|
struct S *b = (struct S*)&e;
|
||||||
|
if (b->s)
|
||||||
|
f ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_func (void)
|
||||||
|
{
|
||||||
|
struct S *b = (struct S*)&f;
|
||||||
|
if (b->s)
|
||||||
|
f ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-prune-output "taking address of expression of type .void." } */
|
||||||
|
|
@ -5048,9 +5048,12 @@ vrp_prop::check_mem_ref (location_t location, tree ref, bool ignore_off_by_one)
|
||||||
a reference/subscript via a pointer to an object that is not
|
a reference/subscript via a pointer to an object that is not
|
||||||
an element of an array. References to members of structs and
|
an element of an array. References to members of structs and
|
||||||
unions are excluded because MEM_REF doesn't make it possible
|
unions are excluded because MEM_REF doesn't make it possible
|
||||||
to identify the member where the reference originated. */
|
to identify the member where the reference originated.
|
||||||
|
Incomplete types are excluded as well because their size is
|
||||||
|
not known. */
|
||||||
tree reftype = TREE_TYPE (arg);
|
tree reftype = TREE_TYPE (arg);
|
||||||
if (POINTER_TYPE_P (reftype)
|
if (POINTER_TYPE_P (reftype)
|
||||||
|
|| !COMPLETE_TYPE_P (reftype)
|
||||||
|| RECORD_OR_UNION_TYPE_P (reftype))
|
|| RECORD_OR_UNION_TYPE_P (reftype))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue