https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110360
--- Comment #33 from anlauf at gcc dot gnu.org --- (In reply to David Edelsohn from comment #32) > I'm leaning back to big-endian vs little-endian, and not a struct issue. A > little-endian STRING will start at the lowest address and a big-endian > STRING will start at the highest address. OK. I've thought a little and came to the following testcase that might help to understand what we have right now (a mess). It tests 6 = 3 x 2 variations, namely passing a literal constant, a variable, and a function result via a temporary to either a fortran subroutine or a C function: % cat value_10_c.c #include <stdio.h> void val_c (char c) { printf ("val_c: char(%d)='%c'\n", (int) c, c); } % cat value_10_f.f90 program p implicit none interface subroutine val_c (c) bind(c) use iso_c_binding, only: c_char character(c_char), value :: c end subroutine val_c end interface integer :: a = 65 character :: c = char(65) call val ("A") call val (c) call val (char(a)) call val_c ("A") call val_c (c) call val_c (char(a)) contains subroutine val (c) character(kind=1), value :: c print *, "val(fortran): ", iachar (c), c end end With the Intel compiler on x86 I get what I expect: val(fortran): 65 A val(fortran): 65 A val(fortran): 65 A val_c: char(65)='A' val_c: char(65)='A' val_c: char(65)='A' With current 14-trunk on x86 I get: % gfc-14 value_10_f.f90 value_10_c.c && ./a.out val(fortran): 65 A val(fortran): 65 A val(fortran): 65 A val_c: char(65)='A' val_c: char(65)='A' val_c: char(-122)='�' The last line of output is junk, which is understood by looking at the dump, as in that case we wrongly pass a reference instead of the value. The C interface part hasn't been touched by the patches in the current PR and obviously also needs a fix. So the next thing is to understand how the C interface works and get it right and consistent (both for LE and BE), and with that knowledge find out how the Fortran part might be.