[Patch, fortran] PR30410 - Host association bug w/EXTERNAL
Paul Thomas
paulthomas2@wanadoo.fr
Fri Jan 12 18:19:00 GMT 2007
I know that it's a bit soon but I have some time tomorrow morning for
gfortran - say I give it Ping**0.5?
Paul
> :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" } }
>
More information about the Fortran
mailing list