[MPI3 Fortran] [Mpi-comments] MPI 3.0:Fortran 2008 interface - issue with the LOGICAL kind

Bill Long longb at cray.com
Fri Mar 15 15:15:26 CDT 2013

On 3/15/13 1:19 PM, Hubert Ritzdorf wrote:
> Hi,
> I'm still developing MPI and I'm also implementing the mpi_f08 module.
> My concern in connection with BIND(C) are the routines which use
> character strings (for example MPI_Error_string())..
> My Intel compiler aborts the compilation for these functions with
> A character dummy argument with length other than 1 is not interoperable

Right. gfortran does the same.  In the interface at 349:14-19, the 
BIND(C) is not compatible with specifying a LEN for the character 
argument greater than 1.

I am not using BIND(C) in the Fortran wrapper definitions.  I'm using 
349:14-19 as printed except with the BIND(C) deleted.  In the 
corresponding interface block for the actual C function in the library, 
the declaration is a character(1)  array string(*).  Here are the texts:

Interface for C function (from 349:13)

interface  !--> MPI_Error_string

    !     int MPI_Error_string (int errorcode, char *string, int 

    function MPI_Error_string_C (errorcode, string, resultlen) &
               BIND(C, name="MPI_Error_string") RESULT (res)
      import :: c_int, c_char
      integer(c_int),value,intent(in)    :: errorcode
      character(kind=c_char),intent(out) :: string(*)
      integer(c_int),intent(out)         :: resultlen
      integer(c_int)                     :: res
    end function MPI_Error_string_C
end interface

Fortran wrapper:

!--> MPI_Error_string

subroutine MPI_Error_string (errorcode, string, resultlen, ierror)
      use :: mpi_C_interfaces_nobuf, only: c_char, MPI_Error_string_C
      INTEGER,                              INTENT(IN) :: errorcode
      INTEGER,                             INTENT(OUT) :: resultlen
      INTEGER, OPTIONAL,                   INTENT(OUT) :: ierror
      integer(c_int) :: errorcode_c
      integer(c_int) :: resultlen_C
      integer(c_int) :: res

      errorcode_c = errorcode
      res = MPI_Error_string_C (errorcode_c, string, resultlen_c)
      resultlen = resultlen_c
      if (present(ierror)) ierror = res

end subroutine MPI_Error_string

This seems to work - at least it compiles with no errors with 2 
different compilers.

> I think, that this is correct (but I possibly missed some info on future changes in TSxxxxx).
> (Nick mentioned in a previous e-mail:
>   "(C) Default CHARACTER is supported only if KIND(' ') is equal to
>          C_CHAR.  However, that will almost certainly be the case."
>   I don't know whether this statement fits to the error message above.
> But almost was true also for the LOGICAL case).
> Or is this another class of routines which don't support BIND(C) ?
> What's about future developments in C and Fortran ?

The Fortran committee operates under the assumption that it cannot 
require (or even influence) changes in the C standard.   The list of C 
types for which interoperability is supported is fairly limited. There 
is an assumption that the C standard will not change the meanings of 
these types, but if they do, and Fortran chooses to be compatible with 
that new C standard, then the changes would be in Fortran. Fortran 2008 
specifies C99 as the C standard for purposes of the interoperability 
feature.  For the TS, everything that is not native to C (the include 
file and specified functions) all have to be supplied by the Fortran vendor.


> May they generate new problems for BIND(C)
> or less problems (i.e. is there a coordinated standardization effort between Fortran and C
> in order to reduce the interoperability problems) ?
> Hubert

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