From: Paul Thomas Date: Sun, 18 Feb 2018 08:59:06 +0000 (+0000) Subject: re PR fortran/80945 (Invalid code with allocatable character array in READ/WRITE... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d5ace3059cbf0130403b356a97a34f8103cadf36;p=gcc.git re PR fortran/80945 (Invalid code with allocatable character array in READ/WRITE statement) 2018-02-18 Paul Thomas PR fortran/80945 * trans-array.c (gfc_conv_expr_descriptor): Set parmtype from the typenode in the case of deferred length characters. 2018-02-18 Paul Thomas PR fortran/80945 * gfortran.dg/associate_35.f90: Remove error, add stop n's and change to run. From-SVN: r257788 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ce98b760ec8..8ecc90af879 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-02-18 Paul Thomas + + PR fortran/80945 + * trans-array.c (gfc_conv_expr_descriptor): Set parmtype from + the typenode in the case of deferred length characters. + 2018-02-17 Thomas Koenig PR fortran/84270 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 79d4d171bdd..e321db35ac2 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -7341,7 +7341,11 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) else { /* Otherwise make a new one. */ - parmtype = gfc_get_element_type (TREE_TYPE (desc)); + if (expr->ts.type == BT_CHARACTER && expr->ts.deferred) + parmtype = gfc_typenode_for_spec (&expr->ts); + else + parmtype = gfc_get_element_type (TREE_TYPE (desc)); + parmtype = gfc_get_array_type_bounds (parmtype, loop.dimen, codim, loop.from, loop.to, 0, GFC_ARRAY_UNKNOWN, false); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 76d8f498295..207a3bad762 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-02-18 Paul Thomas + + PR fortran/80945 + * gfortran.dg/associate_35.f90: Remove error, add stop n's and + change to run. + 2018-02-17 Thomas Koenig PR fortran/84270 diff --git a/gcc/testsuite/gfortran.dg/deferred_character_19.f90 b/gcc/testsuite/gfortran.dg/deferred_character_19.f90 new file mode 100644 index 00000000000..96722a144f6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_19.f90 @@ -0,0 +1,20 @@ +! { dg-do run } +! +! Test fix for PR80945, in which the character length was fixed at zero. +! +! Contributed by Nicolas Koenig +! +program main + implicit none + integer:: i + integer, parameter:: N = 10 + character(20) :: buffer + character(len=:), dimension(:),allocatable:: ca + character(len=:), dimension(:,:),allocatable:: cb + allocate(character(len=N) :: ca(3)) + ca(1) = "foo" + ca(2) = "bar" + ca(3) = "xyzzy" + write (buffer, '(3A5)') ca(1:3) + if (trim (buffer) .ne. "foo bar xyzzy") stop 1 +end program