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