diff options
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 0affecc..660f1c0 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -2285,9 +2285,11 @@ find_array_spec (gfc_expr * e) { gfc_array_spec *as; gfc_component *c; + gfc_symbol *derived; gfc_ref *ref; as = e->symtree->n.sym->as; + derived = NULL; for (ref = e->ref; ref; ref = ref->next) switch (ref->type) @@ -2301,9 +2303,19 @@ find_array_spec (gfc_expr * e) break; case REF_COMPONENT: - for (c = e->symtree->n.sym->ts.derived->components; c; c = c->next) + if (derived == NULL) + derived = e->symtree->n.sym->ts.derived; + + c = derived->components; + + for (; c; c = c->next) if (c == ref->u.c.component) - break; + { + /* Track the sequence of component references. */ + if (c->ts.type == BT_DERIVED) + derived = c->ts.derived; + break; + } if (c == NULL) gfc_internal_error ("find_array_spec(): Component not found"); |