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