I have fixed this as 'obvious' on 8-branch(r264925) and trunk(r264915). Paul
2018-10-08 Paul Thomas <pa...@gcc.gnu.org> Backport from trunk PR fortran/86372 * trans-stmt.c (trans_associate_var): Character associate names with variable string length do not have to be deferred length for the string length to be set, if variable. 2018-10-08 Paul Thomas <pa...@gcc.gnu.org> Backport from trunk PR fortran/86372 * gfortran.dg/associate_41.f90: New test.
Index: gcc/fortran/trans-stmt.c =================================================================== *** gcc/fortran/trans-stmt.c (revision 264912) --- gcc/fortran/trans-stmt.c (working copy) *************** trans_associate_var (gfc_symbol *sym, gf *** 1885,1891 **** } if (sym->ts.type == BT_CHARACTER - && sym->ts.deferred && !sym->attr.select_type_temporary && VAR_P (sym->ts.u.cl->backend_decl) && se.string_length != sym->ts.u.cl->backend_decl) --- 1885,1890 ---- Index: gcc/testsuite/gfortran.dg/associate_41.f90 =================================================================== *** gcc/testsuite/gfortran.dg/associate_41.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/associate_41.f90 (working copy) *************** *** 0 **** --- 1,25 ---- + ! { dg-do run } + ! + ! Test the fix for PR86372 in which the associate name string length was + ! not being set, thereby causing a segfault. + ! + ! Contributed by Janus Weil <ja...@gcc.gnu.org> + ! + program xxx + + character(len=50) :: s + + s = repeat ('*', len(s)) + call sub(s) + if (s .ne. '**'//'123'//repeat ('*', len(s) - 5)) stop 1 + + contains + + subroutine sub(str) + character(len=*), intent(inout) :: str + associate (substr => str(3:5)) + substr = '123' + end associate + end subroutine + + end