This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

*ping* Re: [Patch, Fortran] PR48858/55465 - permit multiple bind(C) declarations (but not definitions) for the same proc


* PING *

Since today, due to a just committed patch, Open MPI (trunk version) won't compile with GCC 4.9 without this patch ...

Patches in this trilogy - the last one is required for Open MPI:
*http://gcc.gnu.org/ml/fortran/2013-05/msg00048.html  - COMMON
*http://gcc.gnu.org/ml/fortran/2013-05/msg00051.html  - PROCEDURE

* http://gcc.gnu.org/ml/fortran/2013-05/msg00056.html - more on bind label handling

On May 17, 2013 08:45, Tobias Burnus wrote:
Followup (and depending on) to the C binding patches for
* COMMON: http://gcc.gnu.org/ml/fortran/2013-05/msg00048.html
* Procedures: http://gcc.gnu.org/ml/fortran/2013-05/msg00051.html
which honour Fortran 2008, where the Fortran name is no longer a global identifier if a binding name has been specified.

The main reason for this patch is a build failure of Open MPI (requires !gcc$ attributes no_arg_check, i.e. it only affects GCC 4.9). Open MPI uses somethine like:
  interface
    subroutine pmpi_something() bind(C,name="MPI_something")
  ...
and in a different module:
  interface
    subroutine mpi_something() bind(C,name="MPI_something")
  ...

Currently, gfortran rejects it because it only permits one definition/declaration per translation unit. However, there is no reason why multiple INTERFACE blocks shouldn't be permitted.


Remarks:

a) Better argument checks if definition and declaration are in the same file. (see INTENT patch in a test case)

b) Currently, no check is done regarding the characteristic of procedure declarations. Of course, the declaration has to be compatible with the C procedure. However, there seems to be the wish* to permit compatible input - even if the Fortran characteristic is different. For instance "int *" takes both a scalar integer ("int i; f(&i)") and arrays ("int i[5]; f(i)"). Or also popular according to the PRs: Taking a C_LOC or an integer(c_intptr_t).

(* Seemingly, also J3 and/or WG5 discussed this (plenum? subgroups?) and they had the permit it. However, finding some official document is difficult.)

I was wondering for a while what should be permitted and what shouldn't, but I have now decided to put that completely into the hands of the user.


Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]