------- Additional Comments From fxcoudert at gcc dot gnu dot org  2005-09-11 
21:27 -------
This is a front-end bug. We generate wrong code for all the ioparm members that
are passed by reference (the pointers are cast, instead of creating
temporaries). All cases handled by set_parameter_ref (in trans-io.c) are handled
incorrectly when given a kind different that the GFC_INTEGER_4. Exhaustive list
(hopefully) is: iostat, exist, opened, number, named, recl, nextrec, size and
iolength. Two examples:


$ cat a.f90
  logical*8 ex
  inquire (file="foo",exist=ex)
  end
$ gfortran -fdump-tree-original a.f90
$ cat a.f90.t02.original 
MAIN__ ()
{
  logical8 ex;

  _gfortran_filename = "a.f90";
  _gfortran_line = 2;
  _gfortran_ioparm.file = "foo";
  _gfortran_ioparm.file_len = 3;
  _gfortran_ioparm.exist = (int4 *) &ex;
  _gfortran_st_inquire ();
}


$ cat b.f90                                
  integer*8 i
  write(*,"()",iostat=i)
  end
$ gfortran -fdump-tree-original b.f90
$ cat b.f90.t02.original 
MAIN__ ()
{
  int8 i;

  _gfortran_filename = "b.f90";
  _gfortran_line = 2;
  _gfortran_ioparm.unit = 6;
  _gfortran_ioparm.format = "()";
  _gfortran_ioparm.format_len = 2;
  _gfortran_ioparm.iostat = (int4 *) &i;
  _gfortran_st_write ();
  _gfortran_st_write_done ();
}

My guess is that in both cases, we should create a temporary before the call,
set the ioparm member to that temporary, make the library call and then get the
value from the temporary back to the real variable. Unfortunately, I have no
idea how to do that (i'm not much of a front-end guy).

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|libfortran                  |fortran
           Keywords|                            |wrong-code
   Last reconfirmed|2005-05-19 16:51:29         |2005-09-11 21:27:46
               date|                            |


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

Reply via email to