diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2020-12-29 17:37:25 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2020-12-29 17:37:25 +0000 |
commit | feae0af82753e06fbff6103da5fbb3b28e1ddbd7 (patch) | |
tree | 3f47e7f4abee7148e23f980847905d4f92c6b343 | |
parent | 02a2d78f7ad05fae2cacd151e6c68456020a2158 (diff) | |
download | gcc-feae0af82753e06fbff6103da5fbb3b28e1ddbd7.zip gcc-feae0af82753e06fbff6103da5fbb3b28e1ddbd7.tar.gz gcc-feae0af82753e06fbff6103da5fbb3b28e1ddbd7.tar.bz2 |
Fortran: Fix deferred character lengths in array constructors [PR93833].
2020-12-29 Paul Thomas <pault@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.
-rw-r--r-- | gcc/fortran/trans-array.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/deferred_character_36.f90 | 16 |
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 2c6be71..33e05be 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; } diff --git a/gcc/testsuite/gfortran.dg/deferred_character_36.f90 b/gcc/testsuite/gfortran.dg/deferred_character_36.f90 new file mode 100644 index 0000000..65f2464 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_36.f90 @@ -0,0 +1,16 @@ +! { dg-do run } +! +! Test the fix for PR93833, which ICEd as shown. +! +! Contributed by Gerhard Steinmetz <gscfq@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 |