From 2f06ccc69e7513ff60afd0290e4a50f6961eb5bf Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Fri, 17 Jun 2005 00:13:26 +0200 Subject: [PATCH] re PR libfortran/16436 (gfortran TL edit descriptor failure - test f77-edit-t-in.f) PR libfortran/16436 * io/transfer.c (read_sf): Correct updating of bytes_left field. (formatted_transfer): Correct updating of bytes_left field and reformatting code (comments and whitespace). * io/unix.c (move_pos_offset): "active" field should not be changed here. Whitespace corrections. * gfortran.dg/g77/f77-edit-t-in.f: Not XFAIL-ed any more. From-SVN: r101100 --- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/g77/f77-edit-t-in.f | 2 +- libgfortran/ChangeLog | 9 +++++++ libgfortran/io/transfer.c | 24 +++++++++---------- libgfortran/io/unix.c | 18 ++++++-------- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 09f9d718660..f03b329f56d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-17 Francois-Xavier Coudert + + PR libfortran/16436 + * gfortran.dg/g77/f77-edit-t-in.f: Not XFAIL-ed any more. + 2005-06-16 Richard Guenther * gcc.target/i386/attributes-error.c: New testcase. diff --git a/gcc/testsuite/gfortran.dg/g77/f77-edit-t-in.f b/gcc/testsuite/gfortran.dg/g77/f77-edit-t-in.f index 6abd1967b89..2314080d708 100644 --- a/gcc/testsuite/gfortran.dg/g77/f77-edit-t-in.f +++ b/gcc/testsuite/gfortran.dg/g77/f77-edit-t-in.f @@ -3,7 +3,7 @@ C (ANSI X3.9-1978 Section 13.5.3.2) C C Origin: David Billinghurst C -C { dg-do run {xfail *-*-*} } gfortran PR 16436 +C { dg-do run } integer i,j real a,b,c,d,e character*32 in diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 64197060bee..0467cb118cb 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,12 @@ +2005-06-17 Francois-Xavier Coudert + + PR libfortran/16436 + * io/transfer.c (read_sf): Correct updating of bytes_left field. + (formatted_transfer): Correct updating of bytes_left field and + reformatting code (comments and whitespace). + * io/unix.c (move_pos_offset): "active" field should not be + changed here. Whitespace corrections. + 2005-06-15 Francois-Xavier Coudert PR libfortran/21950 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 46bec834a27..c81cb47eaa3 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -160,7 +160,6 @@ read_sf (int *length) return base; } - current_unit->bytes_left = options.default_recl; readlen = 1; n = 0; @@ -214,6 +213,7 @@ read_sf (int *length) sf_seen_eor = 0; } while (n < *length); + current_unit->bytes_left -= *length; if (ioparm.size != NULL) *ioparm.size += *length; @@ -675,22 +675,19 @@ formatted_transfer (bt type, void *p, int len) case FMT_TL: case FMT_T: - if (f->format==FMT_TL) - { - pos = f->u.n ; - pos= current_unit->recl - current_unit->bytes_left - pos; - } - else // FMT==T + if (f->format == FMT_TL) + pos = current_unit->recl - current_unit->bytes_left - f->u.n; + else /* FMT_T */ { - consume_data_flag = 0 ; - pos = f->u.n - 1; + consume_data_flag = 0; + pos = f->u.n - 1; } if (pos < 0 || pos >= current_unit->recl ) - { - generate_error (ERROR_EOR, "T Or TL edit position error"); - break ; - } + { + generate_error (ERROR_EOR, "T Or TL edit position error"); + break ; + } m = pos - (current_unit->recl - current_unit->bytes_left); if (m == 0) @@ -707,6 +704,7 @@ formatted_transfer (bt type, void *p, int len) if (m < 0) { move_pos_offset (current_unit->s,m); + current_unit->bytes_left -= m; } break; diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index f82ffa73041..f4ee889cdda 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -154,26 +154,22 @@ move_pos_offset (stream* st, int pos_off) unix_stream * str = (unix_stream*)st; if (pos_off < 0) { - str->active += pos_off; - if (str->active < 0) - str->active = 0; + str->logical_offset += pos_off; - str->logical_offset += pos_off; - - if (str->dirty_offset+str->ndirty > str->logical_offset) + if (str->dirty_offset + str->ndirty > str->logical_offset) { - if (str->ndirty + pos_off > 0) - str->ndirty += pos_off ; + if (str->ndirty + pos_off > 0) + str->ndirty += pos_off; else { str->dirty_offset += pos_off + pos_off; - str->ndirty = 0 ; + str->ndirty = 0; } } - return pos_off ; + return pos_off; } - return 0 ; + return 0; } -- 2.30.2