diff options
author | Mark Eggleston <markeggleston@gcc.gnu.org> | 2020-07-17 14:22:48 +0100 |
---|---|---|
committer | Mark Eggleston <markeggleston@gcc.gnu.org> | 2020-07-29 11:16:38 +0100 |
commit | c2e99836a2751b6d970ca6e50c1a368f5d2a2375 (patch) | |
tree | 3b1400bfc24533ac0e088ca7b9909bc609b54462 | |
parent | 12324b9a934654a5c3bf4a614853ded2e0a958af (diff) | |
download | gcc-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.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr53298.f90 | 14 |
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" } |