From 74a1c62fca5ca93ae932ac76ca442660d9c78c3a Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Fri, 2 Jan 2015 17:31:52 +0100 Subject: re PR fortran/57562 ([OOP] ICE due to extended derived type with PARAMETER attribute) 2015-01-02 Janus Weil PR fortran/57562 * expr.c (find_component_ref): Deal with extended types. 2015-01-02 Janus Weil PR fortran/57562 * gfortran.dg/extends_16.f90: New. From-SVN: r219144 --- gcc/fortran/expr.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'gcc/fortran/expr.c') diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 51f527d..2d85092 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1270,12 +1270,23 @@ depart: static gfc_constructor * find_component_ref (gfc_constructor_base base, gfc_ref *ref) { - gfc_component *comp; - gfc_component *pick; + gfc_component *pick = ref->u.c.component; gfc_constructor *c = gfc_constructor_first (base); - comp = ref->u.c.sym->components; - pick = ref->u.c.component; + gfc_symbol *dt = ref->u.c.sym; + int ext = dt->attr.extension; + + /* For extended types, check if the desired component is in one of the + * parent types. */ + while (ext > 0 && gfc_find_component (dt->components->ts.u.derived, + pick->name, true, true)) + { + dt = dt->components->ts.u.derived; + c = gfc_constructor_first (c->expr->value.constructor); + ext--; + } + + gfc_component *comp = dt->components; while (comp != pick) { comp = comp->next; -- cgit v1.1