https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108581
--- Comment #4 from anlauf at gcc dot gnu.org --- The following one-liner fixes the issue: diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc index df2fef70172..b73a8b4948d 100644 --- a/gcc/fortran/trans-io.cc +++ b/gcc/fortran/trans-io.cc @@ -2644,6 +2644,7 @@ gfc_trans_transfer (gfc_code * code) if (expr->ts.type != BT_CLASS && expr->expr_type == EXPR_VARIABLE && ((expr->symtree->n.sym->ts.type == BT_DERIVED && expr->ts.deferred) + || (expr->ts.type == BT_CHARACTER && expr->ts.deferred) || (expr->symtree->n.sym->assoc && expr->symtree->n.sym->assoc->variable) || gfc_expr_attr (expr).pointer)) However, this is overkill and regresses on gfortran.dg/implied_do_io_4.f90