aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2010-05-26 05:11:04 +0000
committerPaul Thomas <pault@gcc.gnu.org>2010-05-26 05:11:04 +0000
commitcc9a4ca9331ad603c930616c7d5700b5b56dc82b (patch)
tree87a9d3162eb4029d9950ddcf9eb6a94a7bb4c09f
parent1515fb61593745442a3c99552d0136320fce2a6a (diff)
downloadgcc-cc9a4ca9331ad603c930616c7d5700b5b56dc82b.zip
gcc-cc9a4ca9331ad603c930616c7d5700b5b56dc82b.tar.gz
gcc-cc9a4ca9331ad603c930616c7d5700b5b56dc82b.tar.bz2
re PR fortran/40011 (Problems with -fwhole-file)
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-26 Paul Thomas <pault@gcc.gnu.org> PR fortran/40011 * gfortran.dg/whole_file_19.f90 : New test. From-SVN: r159852
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c29
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/whole_file_19.f9025
4 files changed, 51 insertions, 14 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a28bb25..14a2eda 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index f2c2440..1538ea0 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 08d1136..abfdca5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..56f3cb6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/whole_file_19.f90
@@ -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" } }