diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 34 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 13 | ||||
-rwxr-xr-x | gcc/testsuite/gfortran.dg/derived_pointer_recursion.f90 | 22 |
4 files changed, 62 insertions, 16 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 94e2418a..86aeeae 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,14 @@ 2005-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/24092 + * trans-types.c (gfc_get_derived_type): Insert code to obtain backend + declaration for derived types, building if necessary. Return the + derived type if the fields have been built by this process. Otherwise, + continue as before but using the already obtained backend_decls for the + derived type components. Change the gcc_assert to act on the field. + +2005-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/18082 * decl.c (variable_decl): Make a new copy of the character length for each variable, when the expression is not a diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index e16db88..81a90f1 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1415,21 +1415,30 @@ gfc_get_derived_type (gfc_symbol * derived) derived->backend_decl = typenode; } + /* Go through the derived type components, building them as + necessary. The reason for doing this now is that it is + possible to recurse back to this derived type through a + pointer component (PR24092). If this happens, the fields + will be built and so we can return the type. */ + for (c = derived->components; c; c = c->next) + { + if (c->ts.type != BT_DERIVED) + continue; + + if (!c->pointer || c->ts.derived->backend_decl == NULL) + c->ts.derived->backend_decl = gfc_get_derived_type (c->ts.derived); + } + + if (TYPE_FIELDS (derived->backend_decl)) + return derived->backend_decl; + /* Build the type member list. Install the newly created RECORD_TYPE node as DECL_CONTEXT of each FIELD_DECL. */ fieldlist = NULL_TREE; for (c = derived->components; c; c = c->next) { - if (c->ts.type == BT_DERIVED && c->pointer) - { - if (c->ts.derived->backend_decl) - /* We already saw this derived type so use the exiting type. - It doesn't matter if it is incomplete. */ - field_type = c->ts.derived->backend_decl; - else - /* Recurse into the type. */ - field_type = gfc_get_derived_type (c->ts.derived); - } + if (c->ts.type == BT_DERIVED) + field_type = c->ts.derived->backend_decl; else { if (c->ts.type == BT_CHARACTER) @@ -1464,8 +1473,9 @@ gfc_get_derived_type (gfc_symbol * derived) DECL_PACKED (field) |= TYPE_PACKED (typenode); - gcc_assert (!c->backend_decl); - c->backend_decl = field; + gcc_assert (field); + if (!c->backend_decl) + c->backend_decl = field; } /* Now we have the final fieldlist. Record it, then lay out the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be34d21..99d2dbd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-10-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/24092 + * gfortran.dg/derived_pointer_recursion.f90: New test. + 2005-10-12 Adrian Straetling <straetling@de.ibm.com> * gcc.c-torture/execute/20051012-1.c: New test. @@ -5,15 +10,15 @@ 2005-10-12 Paul Thomas <pault@gcc.gnu.org> PR fortran/18082 - gfortran.dg/automatic_char_len_1.f90: New test. + * gfortran.dg/automatic_char_len_1.f90: New test. 2005-10-12 Paul Thomas <pault@gcc.gnu.org> PR fortran/20847 - gfortran.dg/save_common.f90: New test. + * gfortran.dg/save_common.f90: New test. PR fortran/20856 - gfortran.dg/save_result.f90: New test. + * gfortran.dg/save_result.f90: New test. 2005-10-12 Nathan Sidwell <nathan@codesourcery.com> @@ -50,7 +55,7 @@ 2005-10-12 Paul Thomas <pault@gcc.gnu.org> PR fortran/24207 - gfortran.dg/private_type_3.f90: New test. + * gfortran.dg/private_type_3.f90: New test. 2005-10-11 Steven G. Kargl <kargls@comcast.net> diff --git a/gcc/testsuite/gfortran.dg/derived_pointer_recursion.f90 b/gcc/testsuite/gfortran.dg/derived_pointer_recursion.f90 new file mode 100755 index 0000000..5ae5325 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/derived_pointer_recursion.f90 @@ -0,0 +1,22 @@ +! { dg-do compile } +! { dg-options "-O0" } +! Tests patch for PR24092 - This would ICE because of the loop in the +! derived type definitions. +! + module llo + type :: it + character*10 :: k + integer :: c(2) + end type it + type :: bt + type (nt), pointer :: p + end type bt + type :: nt + type (it) :: i + type (bt) :: b + end type nt + type (bt), pointer :: ptr + end module llo +! copyright 1996 Loren P. Meissner -- May be distributed if this line is included. +! Linked List operations with Pointer to Pointer + |