===================================================================
*************** gfc_trans_assignment_1 (gfc_expr * expr1
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))))
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))))
===================================================================
***************
+ ! { 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 <juergen.reuter@desy.de>
+ !
+ 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