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

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #5 from kargl at gcc dot gnu.org ---
(In reply to Thomas Koenig from comment #4)
> (In reply to Jan Hubicka from comment #3)
> > I think the problem here is that fortran uses "long int" while size_t
> > interoperate with "unsigned long int".
> > Does fortran standard promise that the value should inter-operate with
> > size_t as well?
> 
> This is a matter for the compiler.
> 
> In this case, the documentation states
> 
> For arguments of @code{CHARACTER} type, the character length is passed
> as a hidden argument at the end of the argument list.  For
> deferred-length strings, the value is passed by reference, otherwise
> by value.  The character length has the C type @code{size_t} (or
> @code{INTEGER(kind=C_SIZE_T)} in Fortran).
> 
> so the documentation is actually inconsistent (but then, interoperbility
> between Fortran integers and C unsigned types is sort of assumed).
> The library uses gfc_charlen_type, which is a typedef to size_t.
> 
> So, we can fix this either way.  It would probably be best to have
> size_t in the character lengths in the front end as well.

The Fortran 2018 standard in section 18 specific discusses unsigned
integers.  Table 18.2 shows that CHARACTER(KIND=C_SIGNED_CHAR)
interoperates with with C's signed char or unsigned char.  It further
shows that C_SIZE_T is interoperates with C's size_t. The Fortran
standard does not have a C_SSIZE_T kind type parameter.  There is,
however, a non-normative note. From 18-007r1.pdf (aka Fortran 2021),
page 475

   NOTE 1

   ISO/IEC 9899:2011 specifies that the representations for nonnegative
   signed integers are the same as the corresponding values of unsigned
   integers.  Because Fortran does not provide direct support for unsigned
   kinds of integers, the ISO_C_BINDING module does not make accessible
   named constants for their kind type parameter values. A user can use
   the signed kinds of integers to interoperate with the unsigned types
   and all their qualified versions as well. This has the potentially
   surprising side effect that the C type unsigned char is interoperable
   with the type integer with a kind type parameter of C_SIGNED_CHAR.

Now, for the problem at hand, the hidden argument could be passed as
a c_ssize_t.  A Fortan string can never have a negative length. The
only thing that might be of a concern is breaking the libgfortran ABI,
and causing mixed-language programmers who do not use the features of
Section 18 some heartburn.

Reply via email to