OSDN Git Service

2011-12-04 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Dec 2011 16:33:15 +0000 (16:33 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Dec 2011 16:33:15 +0000 (16:33 +0000)
        PR fortran/51383
        * resolve.c (find_array_spec): Use ref->u.c.component
        directly without starting from ts.u.derived.

2011-12-04  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51383
        * gfortran.dg/associate_10.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181992 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/associate_10.f90 [new file with mode: 0644]

index fbe15b0..4b553db 100644 (file)
@@ -1,3 +1,9 @@
+2011-12-04  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/51383
+       * resolve.c (find_array_spec): Use ref->u.c.component
+       directly without starting from ts.u.derived.
+
 2011-12-03  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/48887
index 6baeff4..2e50f04 100644 (file)
@@ -4515,14 +4515,12 @@ find_array_spec (gfc_expr *e)
 {
   gfc_array_spec *as;
   gfc_component *c;
-  gfc_symbol *derived;
   gfc_ref *ref;
 
   if (e->symtree->n.sym->ts.type == BT_CLASS)
     as = CLASS_DATA (e->symtree->n.sym)->as;
   else
     as = e->symtree->n.sym->as;
-  derived = NULL;
 
   for (ref = e->ref; ref; ref = ref->next)
     switch (ref->type)
@@ -4536,26 +4534,7 @@ find_array_spec (gfc_expr *e)
        break;
 
       case REF_COMPONENT:
-       if (derived == NULL)
-         derived = e->symtree->n.sym->ts.u.derived;
-
-       if (derived->attr.is_class)
-         derived = derived->components->ts.u.derived;
-
-       c = derived->components;
-
-       for (; c; c = c->next)
-         if (c == ref->u.c.component)
-           {
-             /* Track the sequence of component references.  */
-             if (c->ts.type == BT_DERIVED)
-               derived = c->ts.u.derived;
-             break;
-           }
-
-       if (c == NULL)
-         gfc_internal_error ("find_array_spec(): Component not found");
-
+       c = ref->u.c.component;
        if (c->attr.dimension)
          {
            if (as != NULL)
index ab8534e..5691a03 100644 (file)
@@ -1,3 +1,8 @@
+2011-12-04  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/51383
+       * gfortran.dg/associate_10.f90: New.
+
 2011-12-04  Ira Rosen  <ira.rosen@linaro.org>
 
        PR middle-end/51285
diff --git a/gcc/testsuite/gfortran.dg/associate_10.f90 b/gcc/testsuite/gfortran.dg/associate_10.f90
new file mode 100644 (file)
index 0000000..53b0554
--- /dev/null
@@ -0,0 +1,23 @@
+! { dg-do compile }
+!
+! PR fortran/51383
+!
+! Contributed by kaiserkarl31@yahoo.com
+!
+! Was failing before at the ref resolution of y1(1)%i.
+!
+program extend
+   type :: a
+      integer :: i
+   end type a
+   type, extends (a) :: b
+      integer :: j
+   end type b
+   type (a) :: x(2)
+   type (b) :: y(2)
+   associate (x1 => x, y1 => y)
+      x1(1)%i = 1
+      ! Commenting out the following line will avoid the error
+      y1(1)%i = 2
+   end associate
+end program extend