[Bug fortran/107266] Reject kind=4 characters for BIND(C) – it invalid and generates wrong code
sgk at troutmask dot apl.washington.edu
gcc-bugzilla@gcc.gnu.org
Tue Oct 18 23:18:33 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107266
--- Comment #13 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Tue, Oct 18, 2022 at 10:40:59AM +0000, burnus at gcc dot gnu.org wrote:
>
> (In reply to kargl from comment #9)
> > Please commit the patch in comment #7. character(kind=4) is not interoperable
> > (unless C_CHAR is CHARACTER(KIND=4) which it isn't). This is an extension and
> > gfortran should flag.
>
> While I concur that the example in comment 1 is not interoperable according to
> the Fortran 2018 standard, I think the patch of comment 7 rejects too much (cf.
> '(b)' below.)
>
> Still, I think something should/could be done – hence, I did not close this PR.
> Namely:
>
> * * *
>
> For C interoperability, I think there are two parts to this:
>
> (a.1) module m; character(kind=4) :: c; end module m
> (a.2) subroutine foo(x) bind(C)
> character(kind=4) :: x
>
> To both the following applies (F2018, 18.3.1 Interoperability of intrinsic
> types):
>
> "A Fortran intrinsic type with particular type parameter values is
> interoperable with a C type if the type and kind type parameter value are
> listed in the table on the same row as that C type. If the type is character,
> the length type parameter is interoperable
> if and only if its value is one."
>
> Hence, neither 'foo' nor 'c' are interoperable.
I'm confused by what you are trying to show with (a.1).
The standard has "If the length is not specified in a
char-selector or a * char-length, the length is 1.", so
that last sentence is no relevant. Moreover, there is
no C binding issue as you did not write
module m
character(kind=4), bind(c) :: c
end module m
gfortran accepts the above when it should be rejected
because of
C820 A variable with the BIND attribute shall be interoperable (18.3).
For (a.2), this should also be rejected per
C1556 A variable that is a dummy argument of a procedure that has ar
proc-language-binding-spec shall be assumed-type or of interoperable
type and kind type parameters.
> (b) subroutine bar(x, y, z) bind(C)
> character(kind=4,len=*) :: x
> character(kind=4) :: y(:)
> character(kind=4), allocatable :: z
>
> This one is valid as F2018's "18.3.6 Interoperability of procedures and
> procedure interfaces" states:
>
It's not valid per C1556 above and
C1555 If proc-language-binding-spec is specified for a procedure, each
dummy argument of type CHARACTER with the ALLOCATABLE or POINTER
attribute shall have deferred character length.
More information about the Gcc-bugs
mailing list