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:
Martin Sebor 2018-07-31 16:47:39 +00:00 committed by Martin Sebor
parent 4de3a1e16a
commit 8e73e6140d
4 changed files with 50 additions and 1 deletions

View File

@ -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

View File

@ -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.

View File

@ -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." } */

View File

@ -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;