------- 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

Reply via email to