From 957a1b14e99596610abb0777ca86a1c80dde24e0 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sun, 1 Mar 2020 16:15:28 +0000 Subject: [PATCH] Patch and ChangeLogs for PR92976 --- gcc/fortran/ChangeLog | 6 ++++ gcc/fortran/match.c | 10 +++++-- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/select_type_48.f90 | 31 ++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/select_type_48.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 39786ecf7cb..1256b95ae75 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2020-03-01 Paul Thomas + + PR fortran/92976 + * match.c (select_type_set_tmp): If the selector array spec has + explicit bounds, make the temporary's bounds deferred. + 2020-03-01 Paul Thomas PR fortran/92959 diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 17196eb1ae6..753a5f1f1a4 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -6327,8 +6327,14 @@ select_type_set_tmp (gfc_typespec *ts) = CLASS_DATA (selector)->attr.dimension; sym->attr.codimension = CLASS_DATA (selector)->attr.codimension; - sym->as - = gfc_copy_array_spec (CLASS_DATA (selector)->as); + if (CLASS_DATA (selector)->as->type != AS_EXPLICIT) + sym->as = gfc_copy_array_spec (CLASS_DATA (selector)->as); + else + { + sym->as = gfc_get_array_spec(); + sym->as->rank = CLASS_DATA (selector)->as->rank; + sym->as->type = AS_DEFERRED; + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ae4df78e27..fd3eeba9946 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-03-01 Paul Thomas + + PR fortran/92976 + * gfortran.dg/select_type_48.f90 : New test. + 2020-03-01 Paul Thomas PR fortran/92959 diff --git a/gcc/testsuite/gfortran.dg/select_type_48.f90 b/gcc/testsuite/gfortran.dg/select_type_48.f90 new file mode 100644 index 00000000000..d9ad01ce4f6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/select_type_48.f90 @@ -0,0 +1,31 @@ +! { dg-do run } +! +! Test the fix for PR92976, in which the TYPE IS statement caused an ICE +! because of the explicit bounds of 'x'. +! +! Contributed by Gerhard Steinmetz +! +program p + type t + integer :: i + end type + class(t), allocatable :: c(:) + allocate (c, source = [t(1111),t(2222),t(3333)]) + call s(c) + if (sum (c%i) .ne. 3333) stop 1 +contains + subroutine s(x) + class(t) :: x(2) + select type (x) +! ICE as compiler attempted to assign descriptor to an array + type is (t) + x%i = 0 +! Make sure that bounds are correctly translated. + call counter (x) + end select + end + subroutine counter (arg) + type(t) :: arg(:) + if (size (arg, 1) .ne. 2) stop 2 + end +end -- 2.30.2