Index: gcc/fortran/trans-expr.c =================================================================== *** gcc/fortran/trans-expr.c (revision 264406) --- gcc/fortran/trans-expr.c (working copy) *************** gfc_trans_assignment_1 (gfc_expr * expr1 *** 10283,10290 **** if (flag_realloc_lhs && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred && !(lss != gfc_ss_terminator ! && ((expr2->expr_type == EXPR_OP ! && expr2->value.op.op == INTRINSIC_CONCAT) || (expr2->expr_type == EXPR_FUNCTION && expr2->value.function.isym != NULL && expr2->value.function.isym->id == GFC_ISYM_CONVERSION)))) --- 10283,10293 ---- if (flag_realloc_lhs && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred && !(lss != gfc_ss_terminator ! && ((expr2->expr_type == EXPR_FUNCTION ! && expr2->value.function.esym != NULL ! && expr2->value.function.esym->attr.elemental) ! || (expr2->expr_type == EXPR_OP ! && expr2->value.op.op == INTRINSIC_CONCAT) || (expr2->expr_type == EXPR_FUNCTION && expr2->value.function.isym != NULL && expr2->value.function.isym->id == GFC_ISYM_CONVERSION)))) Index: gcc/testsuite/gfortran.dg/elemental_function_2.f90 =================================================================== *** gcc/testsuite/gfortran.dg/elemental_function_2.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/elemental_function_2.f90 (working copy) *************** *** 0 **** --- 1,40 ---- + ! { dg-do compile } + ! + ! Test the fix for PR87239 in which the call to the elemental function + ! 'gettwo' was being added before the scalarization loop in the assignment. + ! Since the result temporary was being declared in the loop body, this + ! drove the gimplifier crazy. It is sufficient to compile this testcase + ! since it used to ICE. + ! + ! Contributed by Juergen Reuter + ! + module test + implicit none + contains + + elemental function gettwo( s ) result( res ) + character(*), intent(in) :: s + character(len(s)) :: res + + res = s( 1 : 2 ) + endfunction gettwo + + endmodule test + + program main + use test + implicit none + character(10) :: inp( 5 ) + integer :: i + + ! character(10), allocatable :: out(:) ! this works + character(:), allocatable :: out(:) ! this was stuffed + + inp = [ 'aaa', 'bbb', 'ccc', 'ddd', 'eee' ] + + out = gettwo( inp ) + + do i = 1, size (out, 1) + if (trim (out(i)) .ne. inp(i)(1:2)) stop 1 + end do + endprogram main