aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2005-10-12 20:41:28 +0000
committerPaul Thomas <pault@gcc.gnu.org>2005-10-12 20:41:28 +0000
commitbce71376125366159e33e872d5d34eff3112dd4b (patch)
tree3af3f5392e010df02ed042dbc2ee1cef65f159d4 /gcc
parent8adac33500f774ff06f2900186eb09b42cb5e9c5 (diff)
downloadgcc-bce71376125366159e33e872d5d34eff3112dd4b.zip
gcc-bce71376125366159e33e872d5d34eff3112dd4b.tar.gz
gcc-bce71376125366159e33e872d5d34eff3112dd4b.tar.bz2
[multiple changes]
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-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/24092 * gfortran.dg/derived_pointer_recursion.f90: New test. From-SVN: r105331
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/trans-types.c34
-rw-r--r--gcc/testsuite/ChangeLog13
-rwxr-xr-xgcc/testsuite/gfortran.dg/derived_pointer_recursion.f9022
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
+