Commit f4072316 by Jerry DeLisle

re PR libfortran/31099 (Runtime error on legal code using RECL)

2007-03-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/31099
	* io/open.c (new_unit): Initialize bytes_left and recl_subrecord.
	* io/transfer.c (next_record_w): Set bytes left to record length for
	sequential unformatted I/O.
	(next_record_r): Ditto.
	(read_block_direct): Fix test for exceeding bytes_left.

From-SVN: r122763
parent 7cd4f641
2007-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/31099
* io/open.c (new_unit): Initialize bytes_left and recl_subrecord.
* io/transfer.c (next_record_w): Set bytes left to record length for
sequential unformatted I/O.
(next_record_r): Ditto.
(read_block_direct): Fix test for exceeding bytes_left.
2007-03-08 Daniel Franke <franke.daniel@gmail.com> 2007-03-08 Daniel Franke <franke.daniel@gmail.com>
PR fortran/30947 PR fortran/30947
......
...@@ -437,6 +437,8 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) ...@@ -437,6 +437,8 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
{ {
u->flags.has_recl = 1; u->flags.has_recl = 1;
u->recl = opp->recl_in; u->recl = opp->recl_in;
u->recl_subrecord = u->recl;
u->bytes_left = u->recl;
} }
else else
{ {
......
...@@ -434,11 +434,10 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes) ...@@ -434,11 +434,10 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
/* Check whether we exceed the total record length. */ /* Check whether we exceed the total record length. */
if (dtp->u.p.current_unit->flags.has_recl) if (dtp->u.p.current_unit->flags.has_recl
&& (*nbytes > (size_t) dtp->u.p.current_unit->bytes_left))
{ {
to_read_record = to_read_record = (size_t) dtp->u.p.current_unit->bytes_left;
*nbytes > (size_t) dtp->u.p.current_unit->bytes_left ?
*nbytes : (size_t) dtp->u.p.current_unit->bytes_left;
short_record = 1; short_record = 1;
} }
else else
...@@ -2152,6 +2151,7 @@ next_record_r (st_parameter_dt *dtp) ...@@ -2152,6 +2151,7 @@ next_record_r (st_parameter_dt *dtp)
case UNFORMATTED_SEQUENTIAL: case UNFORMATTED_SEQUENTIAL:
next_record_r_unf (dtp, 1); next_record_r_unf (dtp, 1);
dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
break; break;
case FORMATTED_DIRECT: case FORMATTED_DIRECT:
...@@ -2377,6 +2377,7 @@ next_record_w (st_parameter_dt *dtp, int done) ...@@ -2377,6 +2377,7 @@ next_record_w (st_parameter_dt *dtp, int done)
case UNFORMATTED_SEQUENTIAL: case UNFORMATTED_SEQUENTIAL:
next_record_w_unf (dtp, 0); next_record_w_unf (dtp, 0);
dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
break; break;
case FORMATTED_STREAM: case FORMATTED_STREAM:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment