re PR fortran/15986 (Forward referenced procedure not handled correctly)
authorPaul Brook <paul@codesourcery.com>
Sun, 11 Jul 2004 23:00:08 +0000 (23:00 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Sun, 11 Jul 2004 23:00:08 +0000 (23:00 +0000)
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

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

index c3007b7cb81ff0487d6816ea9d55a161009fab58..3a45a96125a983f099f73c2b590cf153195530a3 100644 (file)
@@ -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
index 1295fb0e5f90aa5f377b6fc842684e907bf4306f..32f5185b2d6d9816d9680579e8049fdb62132c1f 100644 (file)
@@ -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);
index fe9a0655fb77fec4bde64b834b02b21b85c29f85..f4080b5a0bf6284cbd835e554b84d84d6b54aa0b 100644 (file)
@@ -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 (file)
index 0000000..9b6e439
--- /dev/null
@@ -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