I post this patch early last year and did not submit because I was up
to my eyeballs with PR34640. I just forgot about it until it came up
on clf a few days ago.

Bootstraps and regtests on FC23/x86_64 - OK for trunk?

Paul

2018-01-08  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/52162
    * trans-expr.c (gfc_trans_scalar_assign): Flag is_alloc_lhs if
    the rhs expression is neither an elemental nor a conversion
    function.

2018-01-08  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/52162
    * gfortran.dg/bounds_check_19.f90 : New test.
Index: gcc/fortran/trans-expr.c
===================================================================
*** gcc/fortran/trans-expr.c    (revision 256335)
--- gcc/fortran/trans-expr.c    (working copy)
*************** gfc_trans_assignment_1 (gfc_expr * expr1
*** 9924,9932 ****
    /* Walk the lhs.  */
    lss = gfc_walk_expr (expr1);
    if (gfc_is_reallocatable_lhs (expr1)
!       && !(expr2->expr_type == EXPR_FUNCTION
!            && expr2->value.function.isym != NULL))
      lss->is_alloc_lhs = 1;
    rss = NULL;
  
    if ((expr1->ts.type == BT_DERIVED)
--- 9924,9935 ----
    /* Walk the lhs.  */
    lss = gfc_walk_expr (expr1);
    if (gfc_is_reallocatable_lhs (expr1)
!       && !(expr2->expr_type == EXPR_FUNCTION
!          && expr2->value.function.isym != NULL
!          && !(expr2->value.function.isym->elemental
!               || expr2->value.function.isym->conversion)))
      lss->is_alloc_lhs = 1;
+ 
    rss = NULL;
  
    if ((expr1->ts.type == BT_DERIVED)
Index: gcc/testsuite/gfortran.dg/bounds_check_19.f90
===================================================================
*** gcc/testsuite/gfortran.dg/bounds_check_19.f90       (nonexistent)
--- gcc/testsuite/gfortran.dg/bounds_check_19.f90       (working copy)
***************
*** 0 ****
--- 1,24 ----
+ ! { dg-do run }
+ ! { dg-options "-fbounds-check" }
+ !
+ ! Test the fix for PR52162 in which the elemental and conversion
+ ! intrinsics in lines 14 and 19 would cause the bounds check to fail.
+ !
+ ! Contributed by Dominique d'Humieres  <domi...@lps.ens.fr>
+ !
+     integer(4), allocatable :: a(:)
+     integer(8), allocatable :: b(:)
+     real, allocatable :: c(:)
+     allocate (b(7:11), source = [7_8,8_8,9_8,10_8,11_8])
+ 
+     a = b ! Implicit conversion
+ 
+     if (lbound (a, 1) .ne. lbound(b, 1)) call abort
+     if (ubound (a, 1) .ne. ubound(b, 1)) call abort
+ 
+     c = sin(real(b(9:11))/100_8) ! Elemental intrinsic
+ 
+     if ((ubound(c, 1) - lbound(c, 1)) .ne. 2) call abort
+     if (any (nint(asin(c)*100.0) .ne. b(9:11))) call abort
+     deallocate (a, b, c)
+   end

Reply via email to