This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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" } }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]