re PR libfortran/29936 (Missed constraint on RECL=specifier in unformatted sequential WRITE)

2006-11-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/29936
	* io/io.h (unit_flags): Add new flag has_recl.
	* io.open.c (new_unit): Set flag if RECL= was specified.
	* io/transfer.c (us_write): If flag set, leave recl as initialized by
	new_unit.

From-SVN: r119184
This commit is contained in:
Jerry DeLisle
2006-11-25 07:12:56 +00:00
parent 1082076555
commit 328d8f5c8b
4 changed files with 19 additions and 5 deletions

View File

@@ -1,3 +1,11 @@
2006-11-24 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/29936
* io/io.h (unit_flags): Add new flag has_recl.
* io.open.c (new_unit): Set flag if RECL= was specified.
* io/transfer.c (us_write): If flag set, leave recl as initialized by
new_unit.
2006-11-13 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/27895

View File

@@ -470,6 +470,7 @@ typedef struct
unit_status status;
unit_pad pad;
unit_convert convert;
int has_recl;
}
unit_flags;

View File

@@ -406,9 +406,13 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
/* Unspecified recl ends up with a processor dependent value. */
if ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN))
u->recl = opp->recl_in;
{
u->flags.has_recl = 1;
u->recl = opp->recl_in;
}
else
{
u->flags.has_recl = 0;
switch (compile_options.record_marker)
{
case 0:

View File

@@ -1449,10 +1449,11 @@ us_write (st_parameter_dt *dtp)
if (swrite (dtp->u.p.current_unit->s, &dummy, &nbytes) != 0)
generate_error (&dtp->common, ERROR_OS, NULL);
/* For sequential unformatted, we write until we have more bytes
than can fit in the record markers. If disk space runs out first,
it will error on the write. */
dtp->u.p.current_unit->recl = max_offset;
/* For sequential unformatted, if RECL= was not specified in the OPEN
we write until we have more bytes than can fit in the record markers.
If disk space runs out first, it will error on the write. */
if (dtp->u.p.current_unit->flags.has_recl == 0)
dtp->u.p.current_unit->recl = max_offset;
dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
}