aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2004-07-11 23:00:08 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2004-07-11 23:00:08 +0000
commit682e69e1a3138385c1d1c7387baedc3e3f2d3a57 (patch)
treef82026b8934f8c5eee67469dbea505c8961f5d15 /gcc
parentdf23e6bbfaa8254963aa5254a851c942f3c8b594 (diff)
downloadgcc-682e69e1a3138385c1d1c7387baedc3e3f2d3a57.zip
gcc-682e69e1a3138385c1d1c7387baedc3e3f2d3a57.tar.gz
gcc-682e69e1a3138385c1d1c7387baedc3e3f2d3a57.tar.bz2
re PR fortran/15986 (Forward referenced procedure not handled correctly)
PR fortran/15986 * parse.c (gfc_fixup_sibling_symbols): Also look for untyped variables. (parse_contained): Mark contained symbols as referenced. testsuite/ * gfortran.dg/contained_1.f90: New test. From-SVN: r84536
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/parse.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/contained_1.f9033
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c3007b7..3a45a96 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2004-07-11 Paul Brook <paul@codesourcery.com>
+
+ PR fortran/15986
+ * parse.c (gfc_fixup_sibling_symbols): Also look for untyped
+ variables.
+ (parse_contained): Mark contained symbols as referenced.
+
2004-07-11 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/16455
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 1295fb0..32f5185 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -2116,7 +2116,9 @@ gfc_fixup_sibling_symbols (gfc_symbol * sym, gfc_namespace * siblings)
continue;
old_sym = st->n.sym;
- if (old_sym->attr.flavor == FL_PROCEDURE && old_sym->ns == ns
+ if ((old_sym->attr.flavor == FL_PROCEDURE
+ || old_sym->ts.type == BT_UNKNOWN)
+ && old_sym->ns == ns
&& ! old_sym->attr.contained)
{
/* Replace it with the symbol from the parent namespace. */
@@ -2199,6 +2201,7 @@ parse_contained (int module)
/* Mark this as a contained function, so it isn't replaced
by other module functions. */
sym->attr.contained = 1;
+ sym->attr.referenced = 1;
/* Fix up any sibling functions that refer to this one. */
gfc_fixup_sibling_symbols (sym, gfc_current_ns);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fe9a065..f4080b5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-07-11 Paul Brook <paul@codesourcery.com>
+
+ PR fortran/15986
+ * gfortran.dg/contained_1.f90: New test.
+
2004-07-11 Mark Mitchell <mark@codesourcery.com>
* g++.dg/parse/defarg8.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/contained_1.f90 b/gcc/testsuite/gfortran.dg/contained_1.f90
new file mode 100644
index 0000000..9b6e439
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/contained_1.f90
@@ -0,0 +1,33 @@
+! PR15986
+! Siblings may be used as actual arguments, in which case they look like
+! variables during parsing. Also checks that actual variables aren't replaced
+! by siblings with the same name
+! { dg-do run }
+module contained_1_mod
+integer i
+contains
+subroutine a
+ integer :: c = 42
+ call sub(b, c)
+end subroutine a
+subroutine b()
+ i = i + 1
+end subroutine b
+subroutine c
+end subroutine
+end module
+
+subroutine sub (proc, var)
+ external proc1
+ integer var
+
+ if (var .ne. 42) call abort
+ call proc
+end subroutine
+
+program contained_1
+ use contained_1_mod
+ i = 0
+ call a
+ if (i .ne. 1) call abort
+end program