Hi All, I am in the midst of an end-of-year tidy up and found this:
On Wed, 1 Apr 2020 at 18:07, Fritz Reese <fritzore...@gmail.com> wrote: > Unfortunately the mailing list stripped off this attachment so we do > not have a chance to review. As attachments appear to be working > lately, please resubmit this patch. > > Retested on FC33/x86_64 - OK for master, then 9&10 branches in a few weeks? Paul Fortran: Fix deferred character lengths in array constructors [PR93833]. 2020-12-28 Paul Thomas <pa...@gcc.gnu.org> gcc/fortran PR fortran/93833 * trans-array.c (get_array_ctor_var_strlen): If the character length backend_decl cannot be found, convert the expression and use the string length. Clear up some minor white space issues in the rest of the file. gcc/testsuite/ PR fortran/93833 * gfortran.dg/deferred_character_36.f90 : New test.
! { dg-do run } ! ! Test the fix for PR93833, which ICEd as shown. ! ! Contributed by Gerhard Steinmetz <gs...@t-online.de> ! program p character(:), allocatable :: c c = "wxyz" contains subroutine s associate (y => [c]) if (any(y /= [c])) stop 1 end associate end end
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 2c6be710ac8..33e05be5bd1 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -2199,6 +2199,7 @@ get_array_ctor_var_strlen (stmtblock_t *block, gfc_expr * expr, tree * len) gfc_ref *ref; gfc_typespec *ts; mpz_t char_len; + gfc_se se; /* Don't bother if we already know the length is a constant. */ if (*len && INTEGER_CST_P (*len)) @@ -2244,6 +2245,19 @@ get_array_ctor_var_strlen (stmtblock_t *block, gfc_expr * expr, tree * len) } } + /* A last ditch attempt that is sometimes needed for deferred characters. */ + if (!ts->u.cl->backend_decl) + { + gfc_init_se (&se, NULL); + if (expr->rank) + gfc_conv_expr_descriptor (&se, expr); + else + gfc_conv_expr (&se, expr); + gcc_assert (se.string_length != NULL_TREE); + gfc_add_block_to_block (block, &se.pre); + ts->u.cl->backend_decl = se.string_length; + } + *len = ts->u.cl->backend_decl; }