[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