------- Comment #2 from janus at gcc dot gnu dot org 2010-05-20 20:14 ------- To fix this, one basically has to defer the generation of the vtype symbol to resolution stage, which is what the following patch does:
Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (revision 159561) +++ gcc/fortran/resolve.c (working copy) @@ -10589,6 +10589,22 @@ resolve_fl_derived (gfc_symbol *sym) int i; super_type = gfc_get_derived_super_type (sym); + + if (sym->attr.is_class && sym->ts.u.derived == NULL) + { + /* Fix up incomplete CLASS symbols. */ + gfc_component *data; + gfc_component *vptr; + gfc_symbol *vtab; + data = gfc_find_component (sym, "$data", true, true); + vptr = gfc_find_component (sym, "$vptr", true, true); + if (vptr->ts.u.derived == NULL) + { + vtab = gfc_find_derived_vtab (data->ts.u.derived, false); + gcc_assert (vtab); + vptr->ts.u.derived = vtab->ts.u.derived; + } + } /* F2008, C432. */ if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp) Index: gcc/fortran/parse.c =================================================================== --- gcc/fortran/parse.c (revision 159561) +++ gcc/fortran/parse.c (working copy) @@ -2110,22 +2110,6 @@ endType: || c->attr.access == ACCESS_PRIVATE || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.private_comp)) sym->attr.private_comp = 1; - - /* Fix up incomplete CLASS components. */ - if (c->ts.type == BT_CLASS) - { - gfc_component *data; - gfc_component *vptr; - gfc_symbol *vtab; - data = gfc_find_component (c->ts.u.derived, "$data", true, true); - vptr = gfc_find_component (c->ts.u.derived, "$vptr", true, true); - if (vptr->ts.u.derived == NULL) - { - vtab = gfc_find_derived_vtab (data->ts.u.derived, false); - gcc_assert (vtab); - vptr->ts.u.derived = vtab->ts.u.derived; - } - } } if (!seen_component) This patch fixes the test case, but has not been regtested yet. -- janus at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot gnu |janus at gcc dot gnu dot org |dot org | Status|NEW |ASSIGNED Last reconfirmed|2010-05-20 19:15:09 |2010-05-20 20:14:13 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44212