There are interoperability issues with
   integer :: single_variable
   COMMON /name/ single_variable
and C. Currently, gfortran generates the equivalent to
   struct { int single_variable }
however - at least with BIND(C) - it should be compatible to
   int single_variable

That's what bind_c_coms.f90/bind_c_coms_driver.c test and which is failing with
-flto on the LTO branch.

See Fortran 2003, "15.3 Interoperation with C global variables":

"A C variable with external linkage interoperates with a common block that has 
 been specified in a BIND statement
(1) if the C variable is of a struct type and the variables that are members of
    the common block are interoperable with corresponding components of the
    struct type, or
(2) if the common block contains a single variable, and the variable is
    interoperable with the C variable."

 * * *

Next question: What should happen without BIND(C)?
Answer: In F2003, "5.5.2.4 Differences between named common and blank common"
one finds:

"A blank common block has the same properties as a named common block, except 
 for the following:  [...]
(2) Named common blocks of the same name shall be of the same size in all 
    scoping units of a program in which they appear, but blank common blocks
    may be of different sizes."

By construction, blank common names are not accessible from C. Thus from the
standard, one could do the "struct"-less version for named commons and the
"struct" version for blank commons.

I do not know whether there are compatibility issues with old programs;
however, the general advice was to use "struct".

 * * *

I think one should drop some kind of note in the Release Notes and add a few
words about COMMON to
http://gcc.gnu.org/onlinedocs/gfortran/Mixed_002dLanguage-Programming.html

Another huge issue is padding: In C one has - by default - padding, in Fortran
(according to the language standard) not. gfortran uses padding (cf.
-fno-align-commons), however. One probably should exclude the BIND(C) COMMONS
from the -fno-align-commons option and should check that C does exactly the
same padding.

See also PR 41209 for a means to set, e.g., the padding.


-- 
           Summary: COMMON block, BIND(C) and LTO interoperability issues
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: burnus at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41227

Reply via email to