This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, Fortran] PR 44360 - Wrong subroutine called (use vs. host association)
- From: Tobias Burnus <burnus at net-b dot de>
- To: gcc patches <gcc-patches at gcc dot gnu dot org>, gfortran <fortran at gcc dot gnu dot org>
- Date: Tue, 01 Jun 2010 18:01:20 +0200
- Subject: [Patch, Fortran] PR 44360 - Wrong subroutine called (use vs. host association)
As reported in PR 44360 by Vittorio Zecca (thanks!).
For
contains
...
use m, only: sub
call sub()
...
subroutine sub()
gfortran wrongly calls the host-associated ("sibling") subroutine "sub"
rather than the use-associated one of module "m".
Background: First the symbol for "call" at match time is correctly the
subroutine from "m"; however, after parsing "subroutine sub" all of
sibling routines are fixed to point to the host-associated subroutine
rather than adding a bogus external call to "sub_". However, there
checks in gfc_fix_siblings missed a check for use association and also
none of the other checks matched this case. (While use-associated
functions and variables are explicitly typed and thus don't see a
sibling "fix".)
Build and currently regtesting on x86-64-linux, if it succeeds:
OK for 4.4, 4.5, and the trunk? Should it also be applied to 4.3?
Tobias
2010-06-01 Tobias Burnus <burnus@net-b.de>
PR fortran/44360
* parse.c (gfc_fixup_sibling_symbols): Do not "fix" use-associated
symbols.
2010-06-01 Tobias Burnus <burnus@net-b.de>
PR fortran/44360
* gfortran.dg/use_13.f90: New test case.
Index: gcc/fortran/parse.c
===================================================================
--- gcc/fortran/parse.c (revision 160108)
+++ gcc/fortran/parse.c (working copy)
@@ -3667,6 +3667,7 @@ gfc_fixup_sibling_symbols (gfc_symbol *s
|| (old_sym->ts.type != BT_UNKNOWN
&& !old_sym->attr.implicit_type)
|| old_sym->attr.flavor == FL_PARAMETER
+ || old_sym->attr.use_assoc
|| old_sym->attr.in_common
|| old_sym->attr.in_equivalence
|| old_sym->attr.data
Index: gcc/testsuite/gfortran.dg/use_13.f90
===================================================================
--- gcc/testsuite/gfortran.dg/use_13.f90 (revision 0)
+++ gcc/testsuite/gfortran.dg/use_13.f90 (revision 0)
@@ -0,0 +1,45 @@
+! { dg-do run }
+!
+! PR fortran/44360
+!
+! Test-case based on a contribution of Vittorio Zecca.
+!
+! The used subroutine was not the use-associated but the host associated one!
+! The use-associated function/variable were already working properly.
+!
+module m
+ integer :: var = 43
+contains
+ integer function fun()
+ fun = 42
+ end function fun
+ subroutine fun2()
+ var = 44
+ end subroutine fun2
+end module m
+
+module m2
+ integer :: var = -2
+contains
+ subroutine test()
+ ! All procedures/variables below refer to the ones in module "m"
+ ! and not to the siblings in this module "m2".
+ use m
+ if (fun() /= 42) call abort()
+ if (var /= 43) call abort()
+ call fun2()
+ if (var /= 44) call abort()
+ end subroutine test
+ integer function fun()
+ call abort()
+ fun = -3
+ end function fun
+ subroutine fun2()
+ call abort()
+ end subroutine fun2
+end module m2
+
+use m2
+call test()
+end
+! { dg-final { cleanup-modules "m m2" } }