]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/29744 (Type renaming crashes gfortran with excessive memory usage)
authorPaul Thomas <pault@gcc.gnu.org>
Thu, 9 Nov 2006 20:22:19 +0000 (20:22 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Thu, 9 Nov 2006 20:22:19 +0000 (20:22 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-types.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/used_types_12.f90 [new file with mode: 0644]

index fcd1c4ea7e305d03d7a61b26dadb6f037149c9d6..7b5afcf36ee73befc24e02f47744e4a229417842 100644 (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
index ecae59339c1db2b3845999cecd7bbac452e6a48a..56575b009a3747887528580f805019fe57816377 100644 (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);
index cf60056a638412b7cf0e04faf1a897d87cb7f3e3..d56bd0420817d0d7c5ab167fc3e94bfce8e8d641 100644 (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
diff --git a/gcc/testsuite/gfortran.dg/used_types_12.f90 b/gcc/testsuite/gfortran.dg/used_types_12.f90
new file mode 100644 (file)
index 0000000..adfa1f7
--- /dev/null
@@ -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" } }
+