https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57562
janus at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |janus at gcc dot gnu.org --- Comment #7 from janus at gcc dot gnu.org --- The patch in comment 5 is far from complete. Here is a new version, which should be much better. It regtests cleanly and works with all three variants of the test case in this PR. Index: gcc/fortran/expr.c =================================================================== --- gcc/fortran/expr.c (Revision 219140) +++ gcc/fortran/expr.c (Arbeitskopie) @@ -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;