From b28cf1b0833df0850bb862aaf093fafb7babe400 Mon Sep 17 00:00:00 2001 From: msebor Date: Tue, 31 Jul 2018 16:47:39 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@263166 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/Warray-bounds-33.c | 36 +++++++++++++++++++++++++++++++++ gcc/tree-vrp.c | 5 ++++- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/Warray-bounds-33.c 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; -- 2.11.4.GIT