+2020-03-05 Paul Thomas <pault@gcc.gnu.org>
+
+ 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 <markeggleston@gcc.gnu.org>
Backported from mainline
{
char name[GFC_MAX_SYMBOL_LEN];
gfc_symtree *tmp = NULL;
+ gfc_symbol *selector = select_type_stack->selector;
if (!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;
+ }
}
}
--- /dev/null
+! { 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 <gscfq@t-online.de>
+!
+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