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

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
         AssignedTo|unassigned at gcc dot       |janus at gcc dot gnu.org
                   |gnu.org                     |

--- Comment #10 from janus at gcc dot gnu.org 2011-02-10 22:41:47 UTC ---
The following patch makes the test case in comment #3 work correctly:


Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c    (revision 169986)
+++ gcc/fortran/trans-expr.c    (working copy)
@@ -5838,6 +5838,14 @@ is_scalar_reallocatable_lhs (gfc_expr *expr)
     && !expr->ref)
     return true;

+  /* An allocatable class variable with no reference.  */
+  if (expr->symtree->n.sym->ts.type == BT_CLASS
+      && CLASS_DATA (expr->symtree->n.sym)->attr.allocatable
+      && expr->ref && expr->ref->type == REF_COMPONENT
+      && strcmp (expr->ref->u.c.component->name, "_data") == 0
+      && expr->ref->next == NULL)
+    return true;
+
   /* All that can be left are allocatable components.  */
   if ((expr->symtree->n.sym->ts.type != BT_DERIVED
     && expr->symtree->n.sym->ts.type != BT_CLASS)
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c    (revision 169987)
+++ gcc/fortran/resolve.c    (working copy)
@@ -8881,14 +8881,32 @@ resolve_ordinary_assign (gfc_code *code, gfc_names
     gfc_current_ns->proc_name->attr.implicit_pure = 0;
     }

-  /* F03:7.4.1.2.  */
-  /* FIXME: Valid in Fortran 2008, unless the LHS is both polymorphic
-     and coindexed; cf. F2008, 7.2.1.2 and PR 43366.  */
   if (lhs->ts.type == BT_CLASS)
     {
-      gfc_error ("Variable must not be polymorphic in assignment at %L",
-         &lhs->where);
-      return false;
+      /* F08:7.2.1.2.  */
+      if (!gfc_expr_attr (lhs).allocatable)
+    {
+      gfc_error ("Polymorphic variable in intrinsinc assignment must be "
+             "allocatable at %L", &lhs->where);
+      return false;
+    }
+      else if (gfc_expr_attr (lhs).codimension)
+    {
+      gfc_error ("Polymorphic variable in intrinsinc assignment must not be"
+             " coarray at %L", &lhs->where);
+      return false;
+    }
+      else if (gfc_is_coindexed (lhs))
+    {
+      gfc_error ("Polymorphic variable in intrinsinc assignment must not be"
+             " coindexed at %L", &lhs->where);
+      return false;
+    }
+      /* F03:7.4.1.2.  */
+      else if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Variable must not
"
+                   "be polymorphic in assignment at %L",
+                   &lhs->where) == FAILURE)
+    return false;
     }

   /* F2008, Section 7.2.1.2.  */

Reply via email to