From: Martin Sebor Date: Tue, 31 Jul 2018 16:47:39 +0000 (+0000) Subject: PR tree-optimization/86741 - ICE in -Warray-bounds indexing into an object of incompl... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8e73e6140d876c6ae8e1d67bb4dcd2e47c7914ec;p=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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50bd14c7af1..bcaa74cfbd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-07-31 Martin Sebor + + PR tree-optimization/86741 + * tree-vrp.c (vrp_prop::check_mem_ref): Avoid incomplete types. + 2018-07-31 Andreas Krebbel * config/s390/s390.c (s390_expand_setmem): Make the unrolling to diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f741d280fd5..a6a13b3cba9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-07-31 Martin Sebor + + PR tree-optimization/86741 + * gcc.dg/Warray-bounds-33.c: New test. + 2018-07-31 Andreas Krebbel * gcc.target/s390/memset-1.c: Improve testcase. diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-33.c b/gcc/testsuite/gcc.dg/Warray-bounds-33.c new file mode 100644 index 00000000000..28f14b4722c --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-33.c @@ -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." } */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 7ab8898b453..1944ae4f4db 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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 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;