diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2010-08-02 09:22:23 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2010-08-02 09:22:23 +0300 |
commit | 35713675572db7b845a85240329235520195ff49 (patch) | |
tree | b7882064a4e558562d0f7321b64b8535c9f23143 /libgfortran/io | |
parent | 0093ddee9684ad9df246c464c97114f9aaa27c2b (diff) | |
download | gcc-35713675572db7b845a85240329235520195ff49.tar.gz |
Don't update the position flag for non-seekable files, check for stell() error.
From-SVN: r162810
Diffstat (limited to 'libgfortran/io')
-rw-r--r-- | libgfortran/io/unit.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c index a0018dbb4f7..1d522172635 100644 --- a/libgfortran/io/unit.c +++ b/libgfortran/io/unit.c @@ -714,12 +714,19 @@ close_units (void) void update_position (gfc_unit *u) { - if (stell (u->s) == 0) - u->flags.position = POSITION_REWIND; - else if (file_length (u->s) == stell (u->s)) - u->flags.position = POSITION_APPEND; - else - u->flags.position = POSITION_ASIS; + /* If unit is not seekable, this makes no sense (and the standard is + silent on this matter), and thus we don't change the position for + a non-seekable file. */ + if (is_seekable (u->s)) + { + gfc_offset cur = stell (u->s); + if (cur == 0) + u->flags.position = POSITION_REWIND; + else if (cur != -1 && (file_length (u->s) == cur)) + u->flags.position = POSITION_APPEND; + else + u->flags.position = POSITION_ASIS; + } } |