This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [Fortran-experiments] Bind(c) first experiences
- From: "Christopher D. Rickett" <crickett at lanl dot gov>
- To: Tobias Burnus <burnus at net-b dot de>
- Cc: "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>
- Date: Tue, 16 Jan 2007 17:42:20 -0700 (MST)
- Subject: Re: [Fortran-experiments] Bind(c) first experiences
- References: <4588FEED.8010401@net-b.de> <Pine.LNX.4.58.0701161627250.17963@lennox.lanl.gov>
to make a further comment on my statement below, consider the following
code:
module c_ptr_tests_3
use, intrinsic :: iso_c_binding
type, bind(c) :: my_f90_type
integer(c_int) :: i
end type my_f90_type
contains
subroutine sub0(c_struct) bind(c)
type(c_ptr), value :: c_struct
type(my_f90_type), pointer :: f90_type
call c_f_pointer(c_struct, f90_type)
end subroutine sub0
end module c_ptr_tests_3
currently, gfortran accepts this, and i think it is correct in doing so.
in reading section 15.1.2.2 on C_F_POINTER, the FPTR param (second arg)
"shall be a pointer. It is an INTENT(OUT) argument." Also, it says:
"(1) If the value of CPTR is the C address of an interoperable data
entity, FPTR shall be a data pointer with type and type parameters
interoperable with the type of the entity..."
in the example i gave, i'm assuming c_struct is a struct that
interops with my_f90_type. according to the draft, in order for
a derived type to be interoperable, it must have the BIND attribute
(section 15.2.3, line 2). i think it is correct for the pointer to a
derived type to have the bind attribute, in some cases. the pointer
attribute should not be allowed for a derived type decl if it is a dummy
arg to a bind(c) routine, i believe, but i'm not sure i'm checking this at
the moment... i'm also not verifying that the second arg has the POINTER
attribute and has INTENT(OUT); i'll try and add these soon and submit a
patch.
thoughts?
Chris
On Tue, 16 Jan 2007, Christopher D. Rickett wrote:
>
>
> > Thirdly,
> > type(c_funptr), pointer :: pnter
> > is accepted, whereas NAG f95 gives me an error:
> > Error: test.f90, line 4: BIND(C) variable PNTER is a POINTER
> > (I think NAG's error message is a bit misleading.)
> >
> > I think this is prohibited; see F2003, 15.2.2 / 15.2.3:
> > "C_PTR and C_FUNPTR shall be derived types with private components."
> > "C1505 (R429) Each component of a derived type with the BIND attribute
> > shall be a nonpointer, nonallocatable data component with interoperable
> > type and type parameters."
> >
>
> i'm not sure whether the pnter declaration above should be prohibited or
> not. i believe it is just fine as long as it is not a dummy arg trying to
> interop. Tobias, what is the rest of the code?
>
> Thanks.
> Chris
>