Index: gcc/fortran/trans-array.c =================================================================== *** gcc/fortran/trans-array.c (revision 264486) --- gcc/fortran/trans-array.c (working copy) *************** gfc_alloc_allocatable_for_assignment (gf *** 9950,9956 **** { if (expr2->ts.deferred) { ! if (VAR_P (expr2->ts.u.cl->backend_decl)) tmp = expr2->ts.u.cl->backend_decl; else tmp = rss->info->string_length; --- 9950,9957 ---- { if (expr2->ts.deferred) { ! if (expr2->ts.u.cl->backend_decl ! && VAR_P (expr2->ts.u.cl->backend_decl)) tmp = expr2->ts.u.cl->backend_decl; else tmp = rss->info->string_length; Index: gcc/testsuite/gfortran.dg/deferred_character_23.f90 =================================================================== *** gcc/testsuite/gfortran.dg/deferred_character_23.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/deferred_character_23.f90 (working copy) *************** *** 0 **** --- 1,22 ---- + ! { dg-do run } + ! + ! Tests the fix for PR85603. + ! + ! Contributed by Walt Spector + ! + program strlen_bug + implicit none + + character(:), allocatable :: strings(:) + integer :: maxlen + + strings = [ character(32) :: & + 'short', & + 'somewhat longer' ] + maxlen = maxval (len_trim (strings)) + if (maxlen .ne. 15) stop 1 + strings = strings(:)(:maxlen) ! Used to ICE + if (any (strings .ne. ['short ','somewhat longer'])) stop 2 + + deallocate (strings) ! To check for memory leaks + end program