re PR fortran/38291 (Rejects I/O with POS= if FMT=*)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 6 Dec 2008 21:53:11 +0000 (21:53 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 6 Dec 2008 21:53:11 +0000 (21:53 +0000)
2008-12-06  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libfortran/38291
* io/transfer.c (data_transfer_init): Add fbuf_flush inadvertently
ommitted.  Add check for invalid use of REC= with ACCESS="stream".  Fix
comment.

From-SVN: r142528

libgfortran/ChangeLog
libgfortran/io/transfer.c

index 3fc0ca8..765bbd7 100644 (file)
@@ -1,3 +1,10 @@
+2008-12-06  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libfortran/38291
+       * io/transfer.c (data_transfer_init): Add fbuf_flush inadvertently
+       ommitted.  Add check for invalid use of REC= with ACCESS="stream".  Fix
+       comment.
+
 2008-12-06  Adam Nemet  <anemet@caviumnetworks.com>
 
        * runtime/main.c (store_exe_path): Don't crash if argv0 is NULL.
index 4ddfd9f..318d221 100644 (file)
@@ -1967,7 +1967,7 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
       return;
     }
 
-  /* Check the record or position number.  */
+  /* Check the record number.  */
 
   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT
       && (cf & IOPARM_DT_HAS_REC) == 0)
@@ -1986,6 +1986,15 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
       return;
     }
 
+  if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM
+      && (cf & IOPARM_DT_HAS_REC) != 0)
+    {
+      generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
+                     "Record number not allowed for stream access "
+                     "data transfer");
+      return;
+    }
+
   /* Process the ADVANCE option.  */
 
   dtp->u.p.advance_status
@@ -2146,7 +2155,10 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
              /* Required for compatibility between 4.3 and 4.4 runtime. Check
              to see if we might be reading what we wrote before  */
              if (dtp->u.p.current_unit->mode == WRITING)
-               flush(dtp->u.p.current_unit->s);
+               {
+                 fbuf_flush (dtp->u.p.current_unit, 1);      
+                 flush(dtp->u.p.current_unit->s);
+               }
 
              if (dtp->pos < file_length (dtp->u.p.current_unit->s))
                dtp->u.p.current_unit->endfile = NO_ENDFILE;