aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2011-12-04 17:33:15 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2011-12-04 17:33:15 +0100
commit021396710f334405addcabe1b09c274bc123c262 (patch)
tree10f115327210b8d210c20b20be9f6ad8a71d2809 /gcc
parent8f90394af7c8ed289fed2ad86d7925e0a16df2bf (diff)
downloadgcc-021396710f334405addcabe1b09c274bc123c262.zip
gcc-021396710f334405addcabe1b09c274bc123c262.tar.gz
gcc-021396710f334405addcabe1b09c274bc123c262.tar.bz2
re PR fortran/51383 ([OOP] arrays of extended types break when associated)
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-04 Tobias Burnus <burnus@net-b.de> PR fortran/51383 * gfortran.dg/associate_10.f90: New. From-SVN: r181992
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/associate_10.f9023
4 files changed, 35 insertions, 22 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index fbe15b0..4b553db 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 6baeff44..2e50f04 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ab8534e..5691a03 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..53b0554
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/associate_10.f90
@@ -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