The -Warray-bounds enhancement I added to GCC 9 causes false
positives in languages like Fortran whose first array element
is at a non-zero index.  The attached patch has the function
responsible for the warning normalize the array bounds to
always start at zero to avoid these false positives.

Tested on x86_64-linux.

Martin
PR middle-end/91584 - Bogus warning from -Warray-bounds during string assignment

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.

Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c	(revision 275047)
+++ gcc/tree-vrp.c	(working copy)
@@ -4703,31 +4703,23 @@ vrp_prop::check_mem_ref (location_t location, tree
       || 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
   else
     {
       eltsize = 1;
-      arrbounds[0] = 0;
       arrbounds[1] = wi::to_offset (TYPE_SIZE_UNIT (reftype));
     }
 
Index: gcc/testsuite/gfortran.dg/char_array_constructor_4.f90
===================================================================
--- gcc/testsuite/gfortran.dg/char_array_constructor_4.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/char_array_constructor_4.f90	(working copy)
@@ -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

Reply via email to