Commit 5d69df7e by Martin Sebor Committed by Martin Sebor

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.

From-SVN: r275210
parent 7259a9d5
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.
......
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.
......
! 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
......@@ -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));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment