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

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #2 from kargl at gcc dot gnu.org ---
(In reply to Thomas Koenig from comment #1)
> TRANSFER gets this right.

It is unclear what you mean here.

A simplified program that removes the complication of the IO
and ISO C binding is

program test
  if (int(z'FFFFFFFF') /= -1) call abort
end program test

% gfc4x -o z -fno-range-check -fdump-tree-original a.f90
% ./z

Program aborted. Backtrace:
#0  0x4807A01C
#1  0x4807B8CF
#2  0x48134C17
#3  0x8048792 in MAIN__ at a.f90:0
Abort (core dumped)

%cat a.f90.003t.orginal
test ()
{
  _gfortran_abort ();
  L.1:;
}


main (integer(kind=4) argc, character(kind=1) * * argv)
{
  static integer(kind=4) options.0[9] = {68, 1023, 0, 0, 1, 1, 0, 0, 31};

  _gfortran_set_args (argc, argv);
  _gfortran_set_options (9, &options.0[0]);
  test ();
  return 0;
}


I believe the problem lies in gfc_simplify_int.  From what I can
tell, there is never a conversion of a boz to an integer, until we
reach code generation.  The call chain is 

gfc_simplify_int -> simplify->intconv -> gfc_convert_constant ->
gfc_int2int.

By the time we reach gfc_int2int, the boz should have been converted
to the integer, but isn't.  Now, if we compare gfc_simplify_int to
gfc_simplify_real, we see in gfc_simplify_real,

  if (convert_boz (e, kind) == &gfc_bad_expr)
    return &gfc_bad_expr;

where convert_boz will do an explicit conversion of a boz to a 
real type.  There isn't a similar functionality for integer.

Reply via email to