From: Paul Thomas Date: Thu, 5 Mar 2020 10:01:59 +0000 (+0100) Subject: Fix ICE in trans_associate_var X-Git-Tag: releases/gcc-9.3.0~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7beafc829c5b122298093ba517023015611aeca8;p=thirdparty%2Fgcc.git Fix ICE in trans_associate_var 2020-03-05 Paul Thomas Backport from trunk PR fortran/92976 * match.c (select_type_set_tmp): Variable 'selector' to replace select_type_stack->selector. If the selector array spec has explicit bounds, make the temporary's bounds deferred. 2020-03-05 Paul Thomas Backport from trunk PR fortran/92976 * gfortran.dg/select_type_48.f90 : New test. --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8fccf0db5cc3..b3ccda4cf466 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2020-03-05 Paul Thomas + + Backport from trunk + PR fortran/92976 + * match.c (select_type_set_tmp): Variable 'selector' to replace + select_type_stack->selector. If the selector array spec has + explicit bounds, make the temporary's bounds deferred. + 2020-02-19 Mark Eggleston Backported from mainline diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index efc0c2d7bc31..088b69f8ec9d 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -6165,6 +6165,7 @@ select_type_set_tmp (gfc_typespec *ts) { char name[GFC_MAX_SYMBOL_LEN]; gfc_symtree *tmp = NULL; + gfc_symbol *selector = select_type_stack->selector; if (!ts) { @@ -6186,22 +6187,27 @@ select_type_set_tmp (gfc_typespec *ts) gfc_get_sym_tree (name, gfc_current_ns, &tmp, false); gfc_add_type (tmp->n.sym, ts, NULL); - if (select_type_stack->selector->ts.type == BT_CLASS - && select_type_stack->selector->attr.class_ok) + if (selector->ts.type == BT_CLASS && selector->attr.class_ok) { - tmp->n.sym->attr.pointer - = CLASS_DATA (select_type_stack->selector)->attr.class_pointer; + tmp->n.sym->attr.pointer = CLASS_DATA (selector)->attr.class_pointer; /* Copy across the array spec to the selector. */ - if (CLASS_DATA (select_type_stack->selector)->attr.dimension - || CLASS_DATA (select_type_stack->selector)->attr.codimension) + if (CLASS_DATA (selector)->attr.dimension + || CLASS_DATA (selector)->attr.codimension) { tmp->n.sym->attr.dimension - = CLASS_DATA (select_type_stack->selector)->attr.dimension; + = CLASS_DATA (selector)->attr.dimension; tmp->n.sym->attr.codimension - = CLASS_DATA (select_type_stack->selector)->attr.codimension; - tmp->n.sym->as - = gfc_copy_array_spec (CLASS_DATA (select_type_stack->selector)->as); + = CLASS_DATA (selector)->attr.codimension; + if (CLASS_DATA (selector)->as->type != AS_EXPLICIT) + tmp->n.sym->as + = gfc_copy_array_spec (CLASS_DATA (selector)->as); + else + { + tmp->n.sym->as = gfc_get_array_spec(); + tmp->n.sym->as->rank = CLASS_DATA (selector)->as->rank; + tmp->n.sym->as->type = AS_DEFERRED; + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eca8fc03beaa..ec8328c01e29 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-03-05 Paul Thomas + + Backport from trunk + PR fortran/92976 + * gfortran.dg/select_type_48.f90 : New test. + 2020-03-04 Martin Sebor PR c++/90938 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 000000000000..d9ad01ce4f60 --- /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