From 0cade2956fceddbf4548948805a3f130029f9be8 Mon Sep 17 00:00:00 2001
From: pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 9 Nov 2006 20:22:19 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118627 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/fortran/ChangeLog                       |  8 ++++++
 gcc/fortran/trans-types.c                   |  6 ++++-
 gcc/testsuite/ChangeLog                     |  5 ++++
 gcc/testsuite/gfortran.dg/used_types_12.f90 | 30 +++++++++++++++++++++
 4 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/used_types_12.f90

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index fcd1c4ea7e30..7b5afcf36ee7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index ecae59339c1d..56575b009a37 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cf60056a6384..d56bd0420817 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/used_types_12.f90 b/gcc/testsuite/gfortran.dg/used_types_12.f90
new file mode 100644
index 000000000000..adfa1f7c8e35
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/used_types_12.f90
@@ -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" } }
+
-- 
GitLab