diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2008-06-17 18:08:24 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2008-06-17 18:08:24 +0000 |
commit | 9d5c21c1f0bc3888f494dc9114e27570646c0a8f (patch) | |
tree | 777ff3563d772b7c13c9ab6364690ee01d5f088d /gcc/fortran/resolve.c | |
parent | e416eb8f028f20ae4eb1f7b7beeee64715c342d8 (diff) | |
download | gcc-9d5c21c1f0bc3888f494dc9114e27570646c0a8f.zip gcc-9d5c21c1f0bc3888f494dc9114e27570646c0a8f.tar.gz gcc-9d5c21c1f0bc3888f494dc9114e27570646c0a8f.tar.bz2 |
re PR fortran/34396 (Length of substrings defined by expressions not correctly computed in constructors)
2008-06-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34396
* resolve.c (add_dt_to_dt_list): New function.
(resolve_fl_derived): Call new function for pointer components
and when derived type resolved.
2008-06-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/36366
* gfortran.dg/used_types_20.f90: New test.
From-SVN: r136871
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 9c0e45d..37bafd0 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -7586,13 +7586,33 @@ error: } +/* Add a derived type to the dt_list. The dt_list is used in trans-types.c + to give all identical derived types the same backend_decl. */ +static void +add_dt_to_dt_list (gfc_symbol *derived) +{ + gfc_dt_list *dt_list; + + for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next) + if (derived == dt_list->derived) + break; + + if (dt_list == NULL) + { + dt_list = gfc_get_dt_list (); + dt_list->next = gfc_derived_types; + dt_list->derived = derived; + gfc_derived_types = dt_list; + } +} + + /* Resolve the components of a derived type. */ static try resolve_fl_derived (gfc_symbol *sym) { gfc_component *c; - gfc_dt_list * dt_list; int i; for (c = sym->components; c != NULL; c = c->next) @@ -7644,6 +7664,16 @@ resolve_fl_derived (gfc_symbol *sym) return FAILURE; } + /* Ensure that all the derived type components are put on the + derived type list; even in formal namespaces, where derived type + pointer components might not have been declared. */ + if (c->ts.type == BT_DERIVED + && c->ts.derived + && c->ts.derived->components + && c->pointer + && sym != c->ts.derived) + add_dt_to_dt_list (c->ts.derived); + if (c->pointer || c->allocatable || c->as == NULL) continue; @@ -7669,17 +7699,7 @@ resolve_fl_derived (gfc_symbol *sym) return FAILURE; /* Add derived type to the derived type list. */ - for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next) - if (sym == dt_list->derived) - break; - - if (dt_list == NULL) - { - dt_list = gfc_get_dt_list (); - dt_list->next = gfc_derived_types; - dt_list->derived = sym; - gfc_derived_types = dt_list; - } + add_dt_to_dt_list (sym); return SUCCESS; } |