+2004-08-27 Bud Davis <bdavis9659@comcast.net>
+
+ PR fortran/16597
+ * gfortran.dg/pr16597.f90: New test.
+
2004-08-26 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/13801
--- /dev/null
+! pr 16597
+! libgfortran
+! reading a direct access record after it was written did
+! not always return the correct data.
+
+ program gfbug4
+ implicit none
+
+ integer strlen
+ parameter (strlen = 4)
+
+ integer iunit
+ character string *4
+
+ iunit = 99
+ open (UNIT=iunit,FORM='unformatted',ACCESS='direct',RECL=strlen)
+ write (iunit, rec=1) 'ABCD'
+ read (iunit, rec=1) string
+ close (iunit)
+ if (string.ne.'ABCD') call abort
+
+ open (UNIT=iunit,FORM='unformatted',ACCESS='direct',STATUS='scratch',RECL=strlen)
+ write (iunit, rec=1) 'ABCD'
+ read (iunit, rec=1) string
+ close (iunit)
+ if (string.ne.'ABCD') call abort
+ end
+2004-08-27 Bud Davis <bdavis9659@comcast.net>
+
+ PR fortran/16597
+ * io/io.h: created typedef for unit_mode.
+ * io/io.h (gfc_unit): added mode to unit structure.
+ * io/transfer.c (data_transfer_init): flush if a write then
+ read is done on a unit (direct access files).
+ * io/rewind.c (st_rewind): Used unit mode instead of global.
+
2004-08-24 Bud Davis <bdavis9659@comcast.net>
PR fortran/17143
{ ADVANCE_YES, ADVANCE_NO, ADVANCE_UNSPECIFIED }
unit_advance;
-
+typedef enum
+{READING, WRITING}
+unit_mode;
/* Statement parameters. These are all the things that can appear in
an I/O statement. Some are inputs and some are outputs, but none
{ NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE }
endfile;
+ unit_mode mode;
unit_flags flags;
gfc_offset recl, last_record, maxrec, bytes_left;
gfc_unit *unit_root;
int seen_dollar;
- enum {READING, WRITING} mode;
+ unit_mode mode;
unit_blank blank_status;
enum {SIGN_S, SIGN_SS, SIGN_SP} sign_status;
"Cannot REWIND a file opened for DIRECT access");
else
{
- if (g.mode==WRITING)
+ if (u->mode==WRITING)
struncate(u->s);
u->last_record = 0;
if (sseek (u->s, 0) == FAILURE)
return;
}
- /* Position the file. */
+ /* Check to see if we might be reading what we wrote before */
+
+ if (g.mode == READING && current_unit->mode == WRITING)
+ flush(current_unit->s);
+ /* Position the file. */
if (sseek (current_unit->s,
(ioparm.rec - 1) * current_unit->recl) == FAILURE)
generate_error (ERROR_OS, NULL);
}
+ current_unit->mode = g.mode;
+
/* Set the initial value of flags. */
g.blank_status = current_unit->flags.blank;