[Bug fortran/46990] [OOP] gfortran rejects passing a CLASS variable to TYPE

janus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Dec 17 22:04:00 GMT 2010


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46990

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|2010-12-17 20:43:55         |2010.12.17 22:04:35
         AssignedTo|unassigned at gcc dot       |janus at gcc dot gnu.org
                   |gnu.org                     |
     Ever Confirmed|0                           |1

--- Comment #4 from janus at gcc dot gnu.org 2010-12-17 22:04:35 UTC ---
Here is a preliminary patch. Hope I got the logic right ...


Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c    (revision 167977)
+++ gcc/fortran/symbol.c    (working copy)
@@ -4770,21 +4770,24 @@ gfc_type_compatible (gfc_typespec *ts1, gfc_typesp
   bool is_class2 = (ts2->type == BT_CLASS);
   bool is_derived1 = (ts1->type == BT_DERIVED);
   bool is_derived2 = (ts2->type == BT_DERIVED);
+  gfc_symbol *t1,*t2;

-  if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2)
+  if (!(is_derived1 || is_class1) || !(is_derived2 || is_class2))
     return (ts1->type == ts2->type);

-  if (is_derived1 && is_derived2)
-    return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
+  t1 = ts1->u.derived;
+  t2 = ts2->u.derived;
+  
+  if (is_class2)
+    t2 = t2->components->ts.u.derived;

-  if (is_class1 && is_derived2)
-    return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
-                     ts2->u.derived);
-  else if (is_class1 && is_class2)
-    return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
-                     ts2->u.derived->components->ts.u.derived);
+  if (is_derived1)
+    return gfc_compare_derived_types (t1, t2);
   else
-    return 0;
+    {
+      t1 = t1->components->ts.u.derived;
+      return gfc_type_is_extension_of (t1, t2);
+    }
 }



More information about the Gcc-bugs mailing list