:ADDPATCH fortran:
Yes, I know, I know... but I could not resist this one-liner. It is
entirely self-explanatory - the testcase is the reporter's.
The strange thing is that nobody can have tried referencing a
use-associated, external procedure before. As far as I know, this
patch of code has not been touched for ~1 year.
Regtests on IA64/FC5 - OK for trunk and, after a week, for 4.1?
Paul
2007-01-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/30410
* trans-decl.c (gfc_sym_mangled_function_id): Module, external
symbols must not have the module name prepended.
2007-01-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/30410
* gfortran.dg/external_procedures_2.f90: New test.
------------------------------------------------------------------------
Index: gcc/fortran/trans-decl.c
===================================================================
*** gcc/fortran/trans-decl.c (revision 120396)
--- gcc/fortran/trans-decl.c (working copy)
*************** gfc_sym_mangled_function_id (gfc_symbol
*** 315,321 ****
char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
! || (sym->module != NULL && sym->attr.if_source == IFSRC_IFBODY))
{
if (strcmp (sym->name, "MAIN__") == 0
|| sym->attr.proc == PROC_INTRINSIC)
--- 315,322 ----
char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
! || (sym->module != NULL && (sym->attr.external
! || sym->attr.if_source == IFSRC_IFBODY)))
{
if (strcmp (sym->name, "MAIN__") == 0
|| sym->attr.proc == PROC_INTRINSIC)
Index: gcc/testsuite/gfortran.dg/external_procedures_2.f90
===================================================================
*** gcc/testsuite/gfortran.dg/external_procedures_2.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/external_procedures_2.f90 (revision 0)
***************
*** 0 ****
--- 1,41 ----
+ ! { dg-do compile }
+ ! Tests the for PR30410, in which the reference to extfunc would
+ ! be incorrectly made to the module namespace.
+ !
+ ! Contributed by Harald Anlauf <anlauf@gmx.de>
+ !
+ module mod1
+ contains
+ function eval (func, x1)
+ real :: eval, func, x1
+ external :: func
+ eval = func (x1)
+ end function eval
+ end module mod1
+ !-------------------------------
+ module mod2
+ use mod1, only : eval
+ real, external :: extfunc ! This was referenced as __mod2__extfunc__
+ contains
+
+ subroutine foo (x0)
+ real :: x0, x1
+ x1 = 42
+ x0 = eval (extfunc, x1)
+ end subroutine foo
+
+ end module mod2
+ !-------------------------------
+ function extfunc (x)
+ real, intent(in) :: x
+ real :: extfunc
+ extfunc = x
+ end function extfunc
+ !-------------------------------
+ program gfcbug53
+ use mod2, only : foo
+ real :: x0 = 0
+ call foo (x0)
+ print *, x0
+ end program gfcbug53
+ ! { dg-final { cleanup-modules "mod1 mod2" } }