The enhanced handling of MEM_REFs in -Warray-bounds assumes the object from whose address an offset is being computed has a complete type. Since the size of such objects isn't known, whether the offset (or index) from its beginning is valid cannot be reliably determined. The attached patch avoids dealing with such objects.
Martin
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. Index: gcc/testsuite/gcc.dg/Warray-bounds-33.c =================================================================== --- gcc/testsuite/gcc.dg/Warray-bounds-33.c (nonexistent) +++ gcc/testsuite/gcc.dg/Warray-bounds-33.c (working copy) @@ -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." } */ Index: gcc/tree-vrp.c =================================================================== --- gcc/tree-vrp.c (revision 263072) +++ gcc/tree-vrp.c (working copy) @@ -5048,9 +5048,12 @@ vrp_prop::check_mem_ref (location_t location, tree a reference/subscript via a pointer to an object that is not an element of an array. References to members of structs and 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); if (POINTER_TYPE_P (reftype) + || !COMPLETE_TYPE_P (reftype) || RECORD_OR_UNION_TYPE_P (reftype)) return;