aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2018-07-31 16:47:39 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2018-07-31 10:47:39 -0600
commit8e73e6140d876c6ae8e1d67bb4dcd2e47c7914ec (patch)
tree01608338e335ffb796c5c8b825b244aafb00c554
parent4de3a1e16a86d23dec7cea6e5f7f710cf5769e71 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/Warray-bounds-33.c36
-rw-r--r--gcc/tree-vrp.c5
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;