aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2006-05-26 05:09:18 +0000
committerPaul Thomas <pault@gcc.gnu.org>2006-05-26 05:09:18 +0000
commit014057c510440341c2f1135c23fd4da2a42f765b (patch)
tree77c6438a1e7d93720520b1669b3cd5510e89eeea /gcc/fortran/resolve.c
parent3d26efa9eb9e6f032611bf559a6c31c925fc7295 (diff)
downloadgcc-014057c510440341c2f1135c23fd4da2a42f765b.zip
gcc-014057c510440341c2f1135c23fd4da2a42f765b.tar.gz
gcc-014057c510440341c2f1135c23fd4da2a42f765b.tar.bz2
re PR fortran/27709 (Using size of array pointer component as dimension of function result causes gfortran internal error.)
2006-05-26 Paul Thomas <pault@gcc.gnu.org> PR fortran/27709 * resolve.c (find_array_spec): Add gfc_symbol, derived, and use to track repeated component references. PR fortran/27155 PR fortran/27449 * trans-intrinsic.c (gfc_conv_intrinsic_array_transfer): Use se->string_length throughout and use memcpy to populate the expression returned to the scalarizer. (gfc_size_in_bytes): New function. 2006-05-26 Paul Thomas <pault@gcc.gnu.org> PR fortran/27709 * gfortran.dg/spec_expr_4.f90: New test. PR fortran/27155 * gfortran.dg/transfer_array_intrinsic_4.f90: New test. From-SVN: r114127
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 0affecc..660f1c0 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -2285,9 +2285,11 @@ find_array_spec (gfc_expr * e)
{
gfc_array_spec *as;
gfc_component *c;
+ gfc_symbol *derived;
gfc_ref *ref;
as = e->symtree->n.sym->as;
+ derived = NULL;
for (ref = e->ref; ref; ref = ref->next)
switch (ref->type)
@@ -2301,9 +2303,19 @@ find_array_spec (gfc_expr * e)
break;
case REF_COMPONENT:
- for (c = e->symtree->n.sym->ts.derived->components; c; c = c->next)
+ if (derived == NULL)
+ derived = e->symtree->n.sym->ts.derived;
+
+ c = derived->components;
+
+ for (; c; c = c->next)
if (c == ref->u.c.component)
- break;
+ {
+ /* Track the sequence of component references. */
+ if (c->ts.type == BT_DERIVED)
+ derived = c->ts.derived;
+ break;
+ }
if (c == NULL)
gfc_internal_error ("find_array_spec(): Component not found");