]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2010-05-26 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 May 2010 05:11:04 +0000 (05:11 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 May 2010 05:11:04 +0000 (05:11 +0000)
PR fortran/40011
* resolve.c (resolve_global_procedure): Resolve the gsymbol's
namespace before trying to reorder the gsymbols.

2010-05-26  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/40011
* gfortran.dg/whole_file_19.f90 : New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159852 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/whole_file_19.f90 [new file with mode: 0644]

index a28bb25f817895dbebeccb38db7ade301911e254..14a2edaec85d0be53e6f9a9ffd7955938ad5de89 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-26  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/40011
+       * resolve.c (resolve_global_procedure): Resolve the gsymbol's
+       namespace before trying to reorder the gsymbols.
+
 2010-05-25  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/30668
index f2c24409cc81f22ac0524a30d5d574a686d1ec53..1538ea0c9ab705fa42f38c8e528fdfe34e5ee9d8 100644 (file)
@@ -1824,20 +1824,7 @@ resolve_global_procedure (gfc_symbol *sym, locus *where,
        && not_in_recursive (sym, gsym->ns)
        && not_entry_self_reference (sym, gsym->ns))
     {
-      /* Make sure that translation for the gsymbol occurs before
-        the procedure currently being resolved.  */
-      ns = gsym->ns->resolved ? NULL : gfc_global_ns_list;
-      for (; ns && ns != gsym->ns; ns = ns->sibling)
-       {
-         if (ns->sibling == gsym->ns)
-           {
-             ns->sibling = gsym->ns->sibling;
-             gsym->ns->sibling = gfc_global_ns_list;
-             gfc_global_ns_list = gsym->ns;
-             break;
-           }
-       }
-
+      /* Resolve the gsymbol namespace if needed.  */
       if (!gsym->ns->resolved)
        {
          gfc_dt_list *old_dt_list;
@@ -1857,6 +1844,20 @@ resolve_global_procedure (gfc_symbol *sym, locus *where,
          gfc_derived_types = old_dt_list;
        }
 
+      /* Make sure that translation for the gsymbol occurs before
+        the procedure currently being resolved.  */
+      ns = gfc_global_ns_list;
+      for (; ns && ns != gsym->ns; ns = ns->sibling)
+       {
+         if (ns->sibling == gsym->ns)
+           {
+             ns->sibling = gsym->ns->sibling;
+             gsym->ns->sibling = gfc_global_ns_list;
+             gfc_global_ns_list = gsym->ns;
+             break;
+           }
+       }
+
       if (gsym->ns->proc_name->attr.function
            && gsym->ns->proc_name->as
            && gsym->ns->proc_name->as->rank
index 08d1136281bbc5c9d3f73ebfd38bd7b43156002c..abfdca5d413af129d558c5db03c820fa6137c1b2 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-26  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/40011
+       * gfortran.dg/whole_file_19.f90 : New test.
+
 2010-05-25  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/30668
diff --git a/gcc/testsuite/gfortran.dg/whole_file_19.f90 b/gcc/testsuite/gfortran.dg/whole_file_19.f90
new file mode 100644 (file)
index 0000000..56f3cb6
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! { dg-options "-fwhole-file" }
+! Test the fix for pr40011 comment #42, in which the subroutine
+! would just get lost with -fwhole-file.
+!
+! Contributed by Joost VandeVandole <jv244@cam.ac.uk>
+!
+SUBROUTINE c()
+ CALL a()
+END SUBROUTINE c
+
+SUBROUTINE a()
+END SUBROUTINE a
+
+MODULE M
+CONTAINS
+ SUBROUTINE b()
+   CALL c()
+ END SUBROUTINE
+END MODULE
+
+USE M
+CALL b()
+END
+! { dg-final { cleanup-modules "m" } }