aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Eggleston <markeggleston@gcc.gnu.org>2020-07-17 14:22:48 +0100
committerMark Eggleston <markeggleston@gcc.gnu.org>2020-07-29 11:16:38 +0100
commitc2e99836a2751b6d970ca6e50c1a368f5d2a2375 (patch)
tree3b1400bfc24533ac0e088ca7b9909bc609b54462
parent12324b9a934654a5c3bf4a614853ded2e0a958af (diff)
downloadgcc-c2e99836a2751b6d970ca6e50c1a368f5d2a2375.zip
gcc-c2e99836a2751b6d970ca6e50c1a368f5d2a2375.tar.gz
gcc-c2e99836a2751b6d970ca6e50c1a368f5d2a2375.tar.bz2
Fortran : ICE in gfc_conv_scalarized_array_ref PR53298
When an array of characters is an argument to a subroutine and is accessed using (:)(1:) an ICE occurs. The upper bound of the substring does not have an expression and such should not have a Scalarization State structure added to the Scalarization State chain. 2020-07-29 Mark Eggleston <markeggleston@gcc.gnu.org> gcc/fortran/ PR fortran/53298 * trans-array.c (gfc_walk_array_ref): If ref->ss.end is set call gfc_get_scalar_ss. 2020-07-29 Mark Eggleston <markeggleston@gcc.gnu.org> gcc/testsuite/ PR fortran/53298 * gfortran.dg/pr53298.f90: New test.
-rw-r--r--gcc/fortran/trans-array.c3
-rw-r--r--gcc/testsuite/gfortran.dg/pr53298.f9014
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 54e1107..8f93b43 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -10800,7 +10800,8 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref)
if (ref->type == REF_SUBSTRING)
{
ss = gfc_get_scalar_ss (ss, ref->u.ss.start);
- ss = gfc_get_scalar_ss (ss, ref->u.ss.end);
+ if (ref->u.ss.end)
+ ss = gfc_get_scalar_ss (ss, ref->u.ss.end);
}
/* We're only interested in array sections from now on. */
diff --git a/gcc/testsuite/gfortran.dg/pr53298.f90 b/gcc/testsuite/gfortran.dg/pr53298.f90
new file mode 100644
index 0000000..998f88d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr53298.f90
@@ -0,0 +1,14 @@
+! { dg-do run }
+
+program test
+ character(len=5) :: str(3)
+ str = ["abcde", "12345", "ABCDE" ]
+ call f(str(:))
+contains
+ subroutine f(x)
+ character(len=*) :: x(:)
+ write(*,*) x(:)(1:)
+ end subroutine f
+end program test
+
+! { dg-output "abcde12345ABCDE" }