diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-03-09 21:51:39 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-03-09 21:51:39 +0000 |
commit | f4072316a3ef6466ff3b554ca19b14ce4e64eda0 (patch) | |
tree | f373d27e1481d619ffecd03c0e976bc2f878ccbe | |
parent | 7cd4f641a0bbc98177446251888dbd96e3fd12f5 (diff) | |
download | gcc-f4072316a3ef6466ff3b554ca19b14ce4e64eda0.zip gcc-f4072316a3ef6466ff3b554ca19b14ce4e64eda0.tar.gz gcc-f4072316a3ef6466ff3b554ca19b14ce4e64eda0.tar.bz2 |
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
-rw-r--r-- | libgfortran/ChangeLog | 9 | ||||
-rw-r--r-- | libgfortran/io/open.c | 2 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 9 |
3 files changed, 16 insertions, 4 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 889a70d..7f90658 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,12 @@ +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> PR fortran/30947 diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index ef1ce1e..783c5e8 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -437,6 +437,8 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) { u->flags.has_recl = 1; u->recl = opp->recl_in; + u->recl_subrecord = u->recl; + u->bytes_left = u->recl; } else { diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index a7632da..42f8249 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -434,11 +434,10 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes) /* 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 = - *nbytes > (size_t) dtp->u.p.current_unit->bytes_left ? - *nbytes : (size_t) dtp->u.p.current_unit->bytes_left; + to_read_record = (size_t) dtp->u.p.current_unit->bytes_left; short_record = 1; } else @@ -2152,6 +2151,7 @@ next_record_r (st_parameter_dt *dtp) case UNFORMATTED_SEQUENTIAL: next_record_r_unf (dtp, 1); + dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl; break; case FORMATTED_DIRECT: @@ -2377,6 +2377,7 @@ next_record_w (st_parameter_dt *dtp, int done) case UNFORMATTED_SEQUENTIAL: next_record_w_unf (dtp, 0); + dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl; break; case FORMATTED_STREAM: |