https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117643

--- Comment #29 from anlauf at gcc dot gnu.org ---
(In reply to Jerry DeLisle from comment #28)
> --- snip ---
> 
> > In iso-c-binding.def, one finds
> > 
> > NAMED_CHARKNDCST (ISOCBINDING_CHAR, "c_char",gfc_default_character_kind)
> > 
> > so kind('a') == kind(c_char_'a') on all targets.
> 
> This implies that is_c_interop is a "don't care" if we check that type is
> character and the kind is gfc_default_character_kind all should work
> correctly.
> 
>     if (string->ts.type != BT_CHARACTER
>        || (string->ts.type == BT_CHARACTER
> -         && (string->ts.kind != 1 || string->ts.is_c_interop != 1)))
> +         && (string->ts.kind != gfc_default_character_kind)))
>      {
>        gfc_error ("%qs argument of %qs intrinsic at %L shall have "
>                  "a type of CHARACTER(KIND=C_CHAR)",
> 
> I have tested the above and all looks good to me.

This is great.  Go ahead.

***

I frequently get confused by the details of interoperability.
Reading the standard text again:

F2023:18.3.1  Interoperability of intrinsic types

"Table 18.2 shows the interoperability between Fortran intrinsic types and C
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. ..."

I now read this as being compatible with having kind('a') == kind(c_char_'a')
on a particular processor (gfortran), and the above version of the check
then looks entirely correct.

(It is more complicated with interoperability of procedures (18.3.1), which
fortunately is not relevant here.)

Reply via email to