PR fortran/99206 - ICE in add_init_expr_to_sym, at fortran/decl.c:1980
authorHarald Anlauf <anlauf@gmx.de>
Tue, 23 Feb 2021 18:09:14 +0000 (19:09 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 23 Feb 2021 18:09:14 +0000 (19:09 +0100)
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.

gcc/fortran/simplify.c
gcc/testsuite/gfortran.dg/reshape_zerosize_4.f90 [new file with mode: 0644]

index 35f267d..388aca7 100644 (file)
@@ -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 (file)
index 0000000..d9a0d21
--- /dev/null
@@ -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