From 682e69e1a3138385c1d1c7387baedc3e3f2d3a57 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Sun, 11 Jul 2004 23:00:08 +0000 Subject: 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 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/parse.c | 5 ++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/contained_1.f90 | 33 +++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/contained_1.f90 (limited to 'gcc') 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 + + 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 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 + + PR fortran/15986 + * gfortran.dg/contained_1.f90: New test. + 2004-07-11 Mark Mitchell * 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 -- cgit v1.1