[Patch, fortran] PR26779 - Internal module procedure may not have private type dummy arguments
Paul Thomas
paulthomas2@wanadoo.fr
Thu Mar 23 16:58:00 GMT 2006
Ping!
>
> This error is generated by the example, given at the end of Metcalf,
> Reid and
> Cohen - pointer.f90. The attached testcase, illustrates the problem:
>
> In the absence of a patch, the following error is produced:
>
> In file private.f90:11
>
> call init(root, arg)
> 1
> Error: 'ir' is of a PRIVATE type and cannot be a dummy argument of
> 'init',
> which is PUBLIC at (1)
>
> Being an internal procedure, init is NOT public by 2.2.3.3 of the F95
> standard.
> It should have access to all the symbols of its host, therefore this
> error is
> wrong on both levels; ir cannot be private to it, nor is init public!
>
> The patch is easy - simply do not do the test for an internal procedure.
>
> Regtested on FC3/Athlon - OK for trunk and 4.1?
>
> Paul
>
> 2006-03-22 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/26779
> *resolve.c (resolve_fl_procedure): Do not check the access of
> components for internal procedures..
>
> 2006-03-22 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/26779
> * gfortran.dg/private_type_5.f90: New test.
>
>
>
>------------------------------------------------------------------------
>
>Index: gcc/fortran/resolve.c
>===================================================================
>*** gcc/fortran/resolve.c (revision 112211)
>--- gcc/fortran/resolve.c (working copy)
>*************** resolve_fl_procedure (gfc_symbol *sym, i
>*** 4834,4842 ****
> }
> }
>
>! /* Ensure that derived type formal arguments of a public procedure
>! are not of a private type. */
>! if (gfc_check_access(sym->attr.access, sym->ns->default_access))
> {
> for (arg = sym->formal; arg; arg = arg->next)
> {
>--- 4834,4846 ----
> }
> }
>
>! /* Ensure that derived type for are not of a private type. Internal
>! module procedures are excluded by 2.2.3.3 - ie. they are not
>! externally accessible and can access all the objects accesible in
>! the host. */
>! if (!(sym->ns->parent
>! && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
>! && gfc_check_access(sym->attr.access, sym->ns->default_access))
> {
> for (arg = sym->formal; arg; arg = arg->next)
> {
>
>
>------------------------------------------------------------------------
>
>! { dg-do compile }
>! Tests the fix for PR26779, where an error would occur because
>! init was detected to be public with a private type dummy argument.
>!
>! Contributed by Paul Thomas <pault@gcc.gnu.org>
>!
>module test
> public sub
> type, private :: t
> integer :: i
> end type t
>contains
> subroutine sub (arg)
> integer arg
> type(t) :: root
> call init(root, arg)
> contains
> subroutine init(ir, i)
> integer i
> type(t) :: ir
> ir%i = i
> end subroutine init
> end subroutine sub
>end module test
>
More information about the Gcc-patches
mailing list