[MPI3 Fortran] Fwd: [Mpi-comments] MPI 3.0: Fortran 2008 interface - issue with the LOGICAL kind
Bill Long
longb at cray.com
Thu Feb 28 14:52:00 CST 2013
In C when any scalar value is converted to _Bool, the result is 0 if the
value compares equal to 0; otherwise the result is 1. (6.3.1.3 Boolean
type).
The value of C_BOOL as a Fortran KIND type for LOGICAL is such that
1) The bitsize of LOGICAL(C_BOOL) matches the bitsize of _Bool in C for
the companion processor.
2) The Fortran processor uses the internal bit pattern in LOGICAL
(C_BOOL) of 0 to represent false, and 1 to represent true.
If both of these is true (which is the case for many implementations)
then C_BOOL > 0. Otherwise C_BOOL will be negative, and there is no
interoperability with C for LOGICAL.
The fatal flaw in the MPI interface here is that the corresponding C
formal parameter is not _Bool or anything that looks like LOGICAL.
Instead it is 'int'.
There is no concept of a Fortran argument of type LOGICAL interoperating
with a C formal parameter of type int. Usage of that sort in an MPI
interface is simply wrong. One side or the other of the call needs to
be fixed. I would vote for changing the Fortran side to be type
INTEGER(C_INT).
Cheers,
Bill
On 2/28/13 12:29 PM, Craig Rasmussen wrote:
>
> Ack....
>
> I just did a quick rereading of clause 15, Interoperability with C, and
> it appears ill defined to me. Consider the following:
>
> 1. Suppose a compiler has a default logical size equivalent to a default
> integer. Since the standard only requires one logical kind, this
> compiler may not have a type that is interoperable with a _Bool C type.
> In this instance C_BOOL would be a negative value.
> 2. If a compiler does support LOGICAL(kind=C_BOOL), what values of a C
> type _Bool map to .TRUE.? What values map to .FALSE.? These mappings
> may be in clause 15 but I didn't see them at first glance.
> 3. Suppose a Fortran compiler has the following mapping:
>
> _Bool flag = 0; /* flag maps to .FALSE. */
>
> if (flag != 0) ...; /* flag maps to .TRUE. */
>
> This seems to me to be the sane way to map values from C to Fortran.
> The same mapping can be done for any C integer type to an equivalently
> sized Fortran LOGICAL.
>
--
Bill Long longb at cray.com
Fortran Technical Support & voice: 651-605-9024
Bioinformatics Software Development fax: 651-605-9142
Cray Inc./Cray Plaza, Suite 210/380 Jackson St./St. Paul, MN 55101
More information about the mpiwg-fortran
mailing list