PR tree-optimization/89662 - -Warray-bounds ICE on void* arithmetic
authorMartin Sebor <msebor@redhat.com>
Wed, 13 Mar 2019 17:19:43 +0000 (17:19 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 13 Mar 2019 17:19:43 +0000 (11:19 -0600)
gcc/ChangeLog:

PR tree-optimization/89662
* tree-vrp.c (vrp_prop::check_mem_ref): Avoid assuming every type
has a size.

gcc/testsuite/ChangeLog:

PR tree-optimization/89662
* gcc.dg/Warray-bounds-41.c: New test.

From-SVN: r269655

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Warray-bounds-41.c [new file with mode: 0644]
gcc/tree-vrp.c

index 86e210b4e272e60747431d48b1188e0bade5d1c8..cda44b8e0ffaaed7220a7069bef5651b869b6b3f 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-13  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/89662
+       * tree-vrp.c (vrp_prop::check_mem_ref): Avoid assuming every type
+       has a size.
+
 2019-03-13  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/89677
index dc261ed89bc8aa0cb617056f2025e584908de549..f4dc0a009d9ba8fd198b9a28773db5fba3b3333e 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-13  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/89662
+       * gcc.dg/Warray-bounds-41.c: New test.
+
 2019-03-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/63508
diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-41.c b/gcc/testsuite/gcc.dg/Warray-bounds-41.c
new file mode 100644 (file)
index 0000000..fd79590
--- /dev/null
@@ -0,0 +1,33 @@
+/* PR tree-optimization/89662- -Warray-bounds ICE on void* arithmetic
+   { dg-do compile }
+   { dg-options "-O2 -Wall" } */
+
+void* vptr (void *c)
+{
+  return c;
+}
+
+void sink (void*);
+
+void test_vptr_arith_vla_cst (void)
+{
+  int n = 1;
+  char c[n];
+  sink (vptr (c) - 1);    /* { dg-warning "\\\[-Warray-bounds" } */
+}
+
+void test_vptr_arith_vla_range (int n)
+{
+  if (n < 1 || 4 < n)
+    return;
+
+  char c[n];
+  sink (vptr (c) - 1);    /* { dg-warning "\\\[-Warray-bounds" "pr82608" { xfail *-*-* } } */
+}
+
+void test_vptr_arith_vla_var (int n)
+{
+  char c[n];
+  sink (vptr (c) - 1);    /* { dg-warning "\\\[-Warray-bounds" "pr82608" { xfail *-*-* } } */
+}
+
index bf1d947fbf7e80edd2195aee42f9236255e565f9..1092fe045e2a37e9fe321cdd280077b2a94fc398 100644 (file)
@@ -4718,13 +4718,16 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
        {
          /* Extract the element type out of MEM_REF and use its size
             to compute the index to print in the diagnostic; arrays
-            in MEM_REF don't mean anything.   */
+            in MEM_REF don't mean anything.  A type with no size like
+            void is as good as having a size of 1.  */
          tree type = TREE_TYPE (ref);
          while (TREE_CODE (type) == ARRAY_TYPE)
            type = TREE_TYPE (type);
-         tree size = TYPE_SIZE_UNIT (type);
-         offrange[0] = offrange[0] / wi::to_offset (size);
-         offrange[1] = offrange[1] / wi::to_offset (size);
+         if (tree size = TYPE_SIZE_UNIT (type))
+           {
+             offrange[0] = offrange[0] / wi::to_offset (size);
+             offrange[1] = offrange[1] / wi::to_offset (size);
+           }
        }
       else
        {