aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 2b55859..cfc4502 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -920,12 +920,18 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp,
{
gfc_expr *e;
gfc_ref *ref;
+ gfc_was_finalized *f;
if (!comp_is_finalizable (comp))
return;
- if (expr->finalized)
- return;
+ /* If this expression with this component has been finalized
+ already in this namespace, there is nothing to do. */
+ for (f = sub_ns->was_finalized; f; f = f->next)
+ {
+ if (f->e == expr && f->c == comp)
+ return;
+ }
e = gfc_copy_expr (expr);
if (!e->ref)
@@ -1055,7 +1061,13 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp,
sub_ns);
gfc_free_expr (e);
}
- expr->finalized = 1;
+
+ /* Record that this was finalized already in this namespace. */
+ f = sub_ns->was_finalized;
+ sub_ns->was_finalized = XCNEW (gfc_was_finalized);
+ sub_ns->was_finalized->e = expr;
+ sub_ns->was_finalized->c = comp;
+ sub_ns->was_finalized->next = f;
}