PR middle-end/91584 - Bogus warning from -Warray-bounds during string assignment
authorMartin Sebor <msebor@redhat.com>
Fri, 30 Aug 2019 17:42:57 +0000 (17:42 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Fri, 30 Aug 2019 17:42:57 +0000 (11:42 -0600)
gcc/ChangeLog:

PR middle-end/91584
* tree-vrp.c (vrp_prop::check_mem_ref): Normalize type domain bounds
before using them to validate MEM_REF offset.

gcc/testsuite/ChangeLog:
* gfortran.dg/char_array_constructor_4.f90: New test.

From-SVN: r275210

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/char_array_constructor_4.f90 [new file with mode: 0644]
gcc/tree-vrp.c

index e9226d8ed6882b3824fc1f6e15d3603d3f4d06f3..45dd3a28012b27b86311ce0459ff6dde59e4eacf 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-30  Martin Sebor  <msebor@redhat.com>
+
+       PR middle-end/91584
+       * tree-vrp.c (vrp_prop::check_mem_ref): Normalize type domain bounds
+       before using them to validate MEM_REF offset.
+
 2019-08-30  Marek Polacek  <polacek@redhat.com>
 
        * doc/invoke.texi (-Wvolatile): Use @code for volatile.
index 715c4173ce5dc84801f81e6175ca7534cc7f1adb..420ddd49b1f1153229e5fc34a0b6a92bbba70146 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-30  Martin Sebor  <msebor@redhat.com>
+
+       PR middle-end/91584
+       * gfortran.dg/char_array_constructor_4.f90: New test.
+
 2019-08-30  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/pack24.adb: New test.
diff --git a/gcc/testsuite/gfortran.dg/char_array_constructor_4.f90 b/gcc/testsuite/gfortran.dg/char_array_constructor_4.f90
new file mode 100644 (file)
index 0000000..e7c68f9
--- /dev/null
@@ -0,0 +1,13 @@
+! PR 30319 - Bogus warning from -Warray-bounds during string assignment
+! { dg-do compile }
+! { dg-options "-O2 -Warray-bounds" }
+
+program test_bounds
+
+  character(256) :: foo
+
+  foo = '1234'                 ! { dg-bogus "\\\[-Warray-bounds" }
+
+  print *, foo
+
+end program test_bounds
index c95b5ade781e6c512a8f3e9621a5fa857306eede..bc0648080db62189d42ee25d56a5cfd9cf80a25a 100644 (file)
@@ -4703,31 +4703,23 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
       || RECORD_OR_UNION_TYPE_P (reftype))
     return false;
 
+  arrbounds[0] = 0;
+
   offset_int eltsize;
   if (TREE_CODE (reftype) == ARRAY_TYPE)
     {
       eltsize = wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (reftype)));
-
       if (tree dom = TYPE_DOMAIN (reftype))
        {
          tree bnds[] = { TYPE_MIN_VALUE (dom), TYPE_MAX_VALUE (dom) };
-         if (array_at_struct_end_p (arg)
-             || !bnds[0] || !bnds[1])
-           {
-             arrbounds[0] = 0;
-             arrbounds[1] = wi::lrshift (maxobjsize, wi::floor_log2 (eltsize));
-           }
+         if (array_at_struct_end_p (arg) || !bnds[0] || !bnds[1])
+           arrbounds[1] = wi::lrshift (maxobjsize, wi::floor_log2 (eltsize));
          else
-           {
-             arrbounds[0] = wi::to_offset (bnds[0]) * eltsize;
-             arrbounds[1] = (wi::to_offset (bnds[1]) + 1) * eltsize;
-           }
+           arrbounds[1] = (wi::to_offset (bnds[1]) - wi::to_offset (bnds[0])
+                           + 1) * eltsize;
        }
       else
-       {
-         arrbounds[0] = 0;
-         arrbounds[1] = wi::lrshift (maxobjsize, wi::floor_log2 (eltsize));
-       }
+       arrbounds[1] = wi::lrshift (maxobjsize, wi::floor_log2 (eltsize));
 
       if (TREE_CODE (ref) == MEM_REF)
        {
@@ -4742,7 +4734,6 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
   else
     {
       eltsize = 1;
-      arrbounds[0] = 0;
       arrbounds[1] = wi::to_offset (TYPE_SIZE_UNIT (reftype));
     }