diff options
author | Martin Sebor <msebor@redhat.com> | 2018-07-31 16:47:39 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2018-07-31 10:47:39 -0600 |
commit | 8e73e6140d876c6ae8e1d67bb4dcd2e47c7914ec (patch) | |
tree | 01608338e335ffb796c5c8b825b244aafb00c554 | |
parent | 4de3a1e16a86d23dec7cea6e5f7f710cf5769e71 (diff) | |
download | gcc-8e73e6140d876c6ae8e1d67bb4dcd2e47c7914ec.zip gcc-8e73e6140d876c6ae8e1d67bb4dcd2e47c7914ec.tar.gz gcc-8e73e6140d876c6ae8e1d67bb4dcd2e47c7914ec.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Warray-bounds-33.c | 36 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 5 |
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50bd14c..bcaa74c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> * config/s390/s390.c (s390_expand_setmem): Make the unrolling to diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f741d28..a6a13b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> * 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 0000000..28f14b4 --- /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 7ab8898..1944ae4 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; |