+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
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)
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
+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.
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>
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>
--- /dev/null
+! { 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
+