This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix tree-object-size for Fortran ARRAY_REFs (PR fortran/78758)


On December 10, 2016 1:39:52 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>tree-object-size.c has been written with C-family FEs in mind (which is
>where it has been solely used for initially), and as the testcases show
>it doesn't work well with Fortran or other FE when it started to be
>used
>everywhere recently.
>
>Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok
>for
>trunk?

OK.

Richard.

>2016-12-10  Jakub Jelinek  <jakub@redhat.com>
>
>	PR fortran/78758
>	* tree-object-size.c (compute_object_offset) <case ARRAY_REF>: Handle
>	non-zero low bound or non-standard element sizes.
>
>	* gfortran.dg/pr78758.f90: New test.
>	* gfortran.dg/pr38868.f: Remove again bogus warning.
>
>--- gcc/tree-object-size.c.jj	2016-09-02 18:17:33.000000000 +0200
>+++ gcc/tree-object-size.c	2016-12-09 23:21:25.653372199 +0100
>@@ -138,13 +138,18 @@ compute_object_offset (const_tree expr,
> 	return base;
> 
>       t = TREE_OPERAND (expr, 1);
>+      tree low_bound, unit_size;
>+      low_bound = array_ref_low_bound (CONST_CAST_TREE (expr));
>+      unit_size = array_ref_element_size (CONST_CAST_TREE (expr));
>+      if (! integer_zerop (low_bound))
>+	t = fold_build2 (MINUS_EXPR, TREE_TYPE (t), t, low_bound);
>       if (TREE_CODE (t) == INTEGER_CST && tree_int_cst_sgn (t) < 0)
> 	{
> 	  code = MINUS_EXPR;
> 	  t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
> 	}
>       t = fold_convert (sizetype, t);
>-      off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)),
>t);
>+      off = size_binop (MULT_EXPR, unit_size, t);
>       break;
> 
>     case MEM_REF:
>--- gcc/testsuite/gfortran.dg/pr78758.f90.jj	2016-12-09
>23:23:47.036584374 +0100
>+++ gcc/testsuite/gfortran.dg/pr78758.f90	2016-12-09 23:24:14.176240933
>+0100
>@@ -0,0 +1,11 @@
>+! PR fortran/78758
>+! { dg-do compile }
>+! { dg-options "-O2 -Wall" }
>+
>+integer function pr78758 (x)
>+  character(len=*), intent(in) :: x
>+  character(len=16)            :: y
>+  integer, external            :: z
>+  y(2:) = " " // adjustl (x(2:))
>+  pr78758 = z (y)
>+end function pr78758
>--- gcc/testsuite/gfortran.dg/pr38868.f.jj	2016-12-08
>09:17:10.649955170 +0100
>+++ gcc/testsuite/gfortran.dg/pr38868.f	2016-12-10 01:34:53.445284388
>+0100
>@@ -9,7 +9,7 @@
>       ANER(1)='A   '
>       ANER(2)='    '
>       LINE=' '
>-      LINE(78:80)='xyz'   ! { dg-warning "writing 3 bytes into a
>region of size 2" }
>+      LINE(78:80)='xyz'
>       WRITE(*,'(A82)') "'"//LINE//"'"
>       END
> 
>
>	Jakub



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]