https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109322
--- Comment #9 from Steve Kargl <sgk at troutmask dot apl.washington.edu> --- On Wed, Mar 29, 2023 at 07:42:08PM +0000, sgk at troutmask dot apl.washington.edu wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109322 > > --- Comment #3 from Steve Kargl <sgk at troutmask dot apl.washington.edu> --- > On Wed, Mar 29, 2023 at 05:50:05PM +0000, emr-gnu at hev dot psu.edu wrote: > > > > > > Extending my original demonstrator, if you add a "INTEGER(KIND=C_INT64_T) :: > > E", you get the following output: > > > > > gfortran -m32 -fc-prototypes -fsyntax-only foo.f90 > > > > long a; > > {...} > > long_long e; > > } bar; > > The companion C processor is gcc. It is generating > prototypes for that C processor. If one is manipulating > the environment with a command line option such as -m32 > or -m64, then one likely needs to use the same option > with gcc. Does 'gcc -m32' support "long_long"? If it > doesn't, then you'll need to hack on > > gcc/fortran/dump-parse-tree.cc > gcc/fortran/iso-c-binding.def > gcc/fortran/trans-types.cc If one instruments, write_decl() in dump-parse-tree.cc to dump the table of bind(c) types, one can see why you get what you get. % cat a.f90 module foo use, intrinsic :: iso_c_binding implicit none public :: bar type, bind(c) :: bar integer(c_int64_t) a end type end module % gfcx -fc-prototypes -fsyntax-only a.f90 | grep "value=8 IN" 2 value=8 INTEGER c_long 3 value=8 INTEGER c_long_long 4 value=8 INTEGER c_intmax_t 5 value=8 INTEGER c_intptr_t 6 value=8 INTEGER c_ptrdiff_t 7 value=8 INTEGER c_size_t 12 value=8 INTEGER c_int64_t 17 value=8 INTEGER c_int_least64_t 22 value=8 INTEGER c_int_fast64_t typedef struct bar { long a; } bar; The for-loop in write_decl() breaks on the first match to to both value=8 and INTEGER. It never reaches the 12th table entry for c_int64_t.