Dear all,

when simplifying the RESHAPE intrinsic we lost the string length when
the resulting array had size zero.  The attached patch sets the resulting
length from the source.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Thanks,
Harald


PR fortran/99206 - ICE in add_init_expr_to_sym, at fortran/decl.c:1980

Make sure that the string length is properly set during simplification
even when the resulting array is zero-sized.

gcc/fortran/ChangeLog:

        PR fortran/99206
        * simplify.c (gfc_simplify_reshape): Set string length for
        character arguments.

gcc/testsuite/ChangeLog:

        PR fortran/99206
        * gfortran.dg/reshape_zerosize_4.f90: New test.

diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 35f267db588..388aca7c38c 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -6887,6 +6887,8 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
 			       &source->where);
   if (source->ts.type == BT_DERIVED)
     result->ts.u.derived = source->ts.u.derived;
+  if (source->ts.type == BT_CHARACTER && result->ts.u.cl == NULL)
+    result->ts = source->ts;
   result->rank = rank;
   result->shape = gfc_get_shape (rank);
   for (i = 0; i < rank; i++)
diff --git a/gcc/testsuite/gfortran.dg/reshape_zerosize_4.f90 b/gcc/testsuite/gfortran.dg/reshape_zerosize_4.f90
new file mode 100644
index 00000000000..d9a0d217271
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/reshape_zerosize_4.f90
@@ -0,0 +1,14 @@
+! { dg-do run }
+! PR fortran/99206 - ICE in add_init_expr_to_sym, at fortran/decl.c:1980
+! Check simplifier of RESHAPE for character arrays.
+
+program p
+  character(*),        parameter :: a(0) = reshape([  'ab'], [0])
+  character(*,kind=4), parameter :: c(0) = reshape([4_'cd'], [0])
+  if (len (a)                       /= 2) stop 1
+  if (len (reshape (  ['ab'], [0])) /= 2) stop 2
+  if (kind(reshape (  ['ab'], [0])) /= 1) stop 3
+  if (len (c)                       /= 2) stop 4
+  if (len (reshape ([4_'cd'], [0])) /= 2) stop 5
+  if (kind(reshape ([4_'cd'], [0])) /= 4) stop 6
+end

Reply via email to