This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix tree-object-size for Fortran ARRAY_REFs (PR fortran/78758)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 10 Dec 2016 07:17:14 +0100
- Subject: Re: [PATCH] Fix tree-object-size for Fortran ARRAY_REFs (PR fortran/78758)
- Authentication-results: sourceware.org; auth=none
- References: <20161210003952.GK3541@tucnak.redhat.com>
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