summaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>2014-02-21 09:06:57 +0000
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>2014-02-21 09:06:57 +0000
commite8393d495a7b1365ec8a7e88a3371c898289425a (patch)
tree1b9dc5c56919f62925c5e6055abd1a153bdf2466 /gcc/fortran/class.c
parent90af79f40b0a92d0ff83fd000c8ff3a1d348eba9 (diff)
downloadgcc-e8393d495a7b1365ec8a7e88a3371c898289425a.tar.gz
2014-02-21 Janus Weil <janus@gcc.gnu.org>
PR fortran/60234 * gfortran.h (gfc_build_class_symbol): Removed argument. * class.c (gfc_add_component_ref): Fix up missing vtype if necessary. (gfc_build_class_symbol): Remove argument 'delayed_vtab'. vtab is always delayed now, except for unlimited polymorphics. (comp_is_finalizable): Procedure pointer components are not finalizable. * decl. (build_sym, build_struct, attr_decl1): Removed argument of 'gfc_build_class_symbol'. * match.c (copy_ts_from_selector_to_associate, select_type_set_tmp): Ditto. * symbol.c (gfc_set_default_type): Ditto. 2014-02-21 Janus Weil <janus@gcc.gnu.org> PR fortran/60234 * gfortran.dg/finalize_23.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207986 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 8af9172dfcd..fc228cfde1b 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -218,6 +218,14 @@ gfc_add_component_ref (gfc_expr *e, const char *name)
break;
tail = &((*tail)->next);
}
+ if (derived->components->next->ts.type == BT_DERIVED &&
+ derived->components->next->ts.u.derived == NULL)
+ {
+ /* Fix up missing vtype. */
+ gfc_symbol *vtab = gfc_find_derived_vtab (derived->components->ts.u.derived);
+ gcc_assert (vtab);
+ derived->components->next->ts.u.derived = vtab->ts.u.derived;
+ }
if (*tail != NULL && strcmp (name, "_data") == 0)
next = *tail;
(*tail) = gfc_get_ref();
@@ -543,7 +551,7 @@ gfc_intrinsic_hash_value (gfc_typespec *ts)
bool
gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
- gfc_array_spec **as, bool delayed_vtab)
+ gfc_array_spec **as)
{
char name[GFC_MAX_SYMBOL_LEN+1], tname[GFC_MAX_SYMBOL_LEN+1];
gfc_symbol *fclass;
@@ -637,16 +645,17 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
if (!gfc_add_component (fclass, "_vptr", &c))
return false;
c->ts.type = BT_DERIVED;
- if (delayed_vtab
- || (ts->u.derived->f2k_derived
- && ts->u.derived->f2k_derived->finalizers))
- c->ts.u.derived = NULL;
- else
+
+ if (ts->u.derived->attr.unlimited_polymorphic)
{
vtab = gfc_find_derived_vtab (ts->u.derived);
gcc_assert (vtab);
c->ts.u.derived = vtab->ts.u.derived;
}
+ else
+ /* Build vtab later. */
+ c->ts.u.derived = NULL;
+
c->attr.access = ACCESS_PRIVATE;
c->attr.pointer = 1;
}
@@ -790,7 +799,9 @@ has_finalizer_component (gfc_symbol *derived)
static bool
comp_is_finalizable (gfc_component *comp)
{
- if (comp->attr.allocatable && comp->ts.type != BT_CLASS)
+ if (comp->attr.proc_pointer)
+ return false;
+ else if (comp->attr.allocatable && comp->ts.type != BT_CLASS)
return true;
else if (comp->ts.type == BT_DERIVED && !comp->attr.pointer
&& (comp->ts.u.derived->attr.alloc_comp