re PR fortran/29744 (Type renaming crashes gfortran with excessive memory usage)

2006-11-09 Paul Thomas <pault@gcc.gnu.org>

	PR fortran/29744
	* trans-types.c (gfc_get_derived_type): Ensure that the
	proc_name namespace is not the same as the owner namespace and
	that identical derived types in the same namespace share the
	same backend_decl.

2006-11-09 Paul Thomas <pault@gcc.gnu.org>

	PR fortran/29744
	* gfortran.dg/used_types_12.f90: New test.

From-SVN: r118627
This commit is contained in:
Paul Thomas 2006-11-09 20:22:19 +00:00
parent 6acf0b3843
commit ff883a9572
4 changed files with 48 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2006-11-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29744
* trans-types.c (gfc_get_derived_type): Ensure that the
proc_name namespace is not the same as the owner namespace and
that identical derived types in the same namespace share the
same backend_decl.
2006-11-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29699

View File

@ -1484,7 +1484,8 @@ gfc_get_derived_type (gfc_symbol * derived)
build the parent version and use it in the current namespace. */
if (derived->ns->parent)
ns = derived->ns->parent;
else if (derived->ns->proc_name)
else if (derived->ns->proc_name
&& derived->ns->proc_name->ns != derived->ns)
/* Derived types in an interface body obtain their parent reference
through the proc_name symbol. */
ns = derived->ns->proc_name->ns;
@ -1592,6 +1593,9 @@ other_equal_dts:
/* Add this backend_decl to all the other, equal derived types and
their components in this and sibling namespaces. */
for (dt = derived->ns->derived_types; dt; dt = dt->next)
copy_dt_decls_ifequal (derived, dt->derived);
for (ns = derived->ns->sibling; ns; ns = ns->sibling)
for (dt = ns->derived_types; dt; dt = dt->next)
copy_dt_decls_ifequal (derived, dt->derived);

View File

@ -1,3 +1,8 @@
2006-11-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29744
* gfortran.dg/used_types_12.f90: New test.
2006-11-09 Serge Belyshev <belyshev@depni.sinp.msu.ru>
PR middle-end/29726

View File

@ -0,0 +1,30 @@
! { dg-do compile }
! Tests the fix PR29744, which is really a repeat of PR19362.
! The problem came about because the test for PR19362 shifted
! the fix to a subroutine, rather than the main program that
! it originally occurred in. Fixes for subsequent PRs introduced
! a difference between the main program and a contained procedure
! that resulted in the compiler going into an infinite loop.
!
! Contributed by Harald Anlauf <anlauf@gmx.de>
! and originally by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
!
MODULE M
TYPE T0
SEQUENCE
INTEGER I
END TYPE
END
PROGRAM MAIN
USE M, T1 => T0
TYPE T0
SEQUENCE
INTEGER I
END TYPE
TYPE(T0) :: BAR
TYPE(T1) :: BAZ
BAZ = BAR
END
! { dg-final { cleanup-modules "M" } }