re PR fortran/45586 (ICE non-trivial conversion at assignment)
authorMichael Matz <matz@suse.de>
Sat, 12 Feb 2011 13:09:03 +0000 (13:09 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Sat, 12 Feb 2011 13:09:03 +0000 (14:09 +0100)
2011-02-12  Michael Matz  <matz@suse.de>
            Janus Weil  <janus@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/45586
        * trans-expr.c (conv_parent_component_references): Avoid
        unintendent skipping of parent compounds.

Co-Authored-By: Janus Weil <janus@gcc.gnu.org>
Co-Authored-By: Tobias Burnus <burnus@net-b.de>
From-SVN: r170072

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c

index 9980d4ddd69824b751908423fb858eff624eab22..7749cade37a04df6e0e7b3ecc3ee3d454d6f5295 100644 (file)
@@ -1,3 +1,11 @@
+2011-02-12  Michael Matz  <matz@suse.de>
+           Janus Weil  <janus@gcc.gnu.org>
+           Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/45586
+       * trans-expr.c (conv_parent_component_references): Avoid unintendent
+       skipping of parent compounds.
+
 2011-02-11  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/47550
index f19c015259844e564adbc3423a1d2c5762c3d01e..b7d7ed95a6610456f618aad3d75d53d5897b5153 100644 (file)
@@ -538,6 +538,11 @@ conv_parent_component_references (gfc_se * se, gfc_ref * ref)
   dt = ref->u.c.sym;
   c = ref->u.c.component;
 
+  /* Return if the component is not in the parent type.  */
+  for (cmp = dt->components; cmp; cmp = cmp->next)
+    if (strcmp (c->name, cmp->name) == 0)
+      return;
+
   /* Build a gfc_ref to recursively call gfc_conv_component_ref.  */
   parent.type = REF_COMPONENT;
   parent.next = NULL;
@@ -547,23 +552,11 @@ conv_parent_component_references (gfc_se * se, gfc_ref * ref)
   if (dt->backend_decl == NULL)
     gfc_get_derived_type (dt);
 
-  if (dt->attr.extension && dt->components)
-    {
-      if (dt->attr.is_class)
-       cmp = dt->components;
-      else
-       cmp = dt->components->next;
-      /* Return if the component is not in the parent type.  */
-      for (; cmp; cmp = cmp->next)
-       if (strcmp (c->name, cmp->name) == 0)
-         return;
-       
-      /* Otherwise build the reference and call self.  */
-      gfc_conv_component_ref (se, &parent);
-      parent.u.c.sym = dt->components->ts.u.derived;
-      parent.u.c.component = c;
-      conv_parent_component_references (se, &parent);
-    }
+  /* Build the reference and call self.  */
+  gfc_conv_component_ref (se, &parent);
+  parent.u.c.sym = dt->components->ts.u.derived;
+  parent.u.c.component = c;
+  conv_parent_component_references (se, &parent);
 }
 
 /* Return the contents of a variable. Also handles reference/pointer