aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2002-04-23 17:56:10 -0400
committerJason Merrill <jason@gcc.gnu.org>2002-04-23 17:56:10 -0400
commit736020b4a73cd6ea6deaed6239ca6b274c01f9d8 (patch)
treee21e2e2ec8f95826acb255add5c45e0890301a54
parent74c263af801e048d886c552993038419372f8387 (diff)
downloadgcc-736020b4a73cd6ea6deaed6239ca6b274c01f9d8.zip
gcc-736020b4a73cd6ea6deaed6239ca6b274c01f9d8.tar.gz
gcc-736020b4a73cd6ea6deaed6239ca6b274c01f9d8.tar.bz2
fstream.tcc (basic_filebuf::seekoff): Fix for output-only filebufs.
* include/bits/fstream.tcc (basic_filebuf::seekoff): Fix for output-only filebufs. * include/std/std_fstream.h (basic_filebuf::_M_set_indeterminate): Likewise. (basic_filebuf::_M_set_determinate): Likewise. From-SVN: r52685
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/bits/fstream.tcc2
-rw-r--r--libstdc++-v3/include/std/std_fstream.h4
-rw-r--r--libstdc++-v3/testsuite/27_io/ostream_seeks.cc7
4 files changed, 16 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c3667b9..bc89207 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,11 @@
2002-04-23 Jason Merrill <jason@redhat.com>
+ * include/bits/fstream.tcc (basic_filebuf::seekoff): Fix for
+ output-only filebufs.
+ * include/std/std_fstream.h (basic_filebuf::_M_set_indeterminate):
+ Likewise.
+ (basic_filebuf::_M_set_determinate): Likewise.
+
PR libstdc++/6414
* include/bits/fstream.tcc (basic_filebuf::seekoff): Adjust return
value properly in the trivial case.
diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc
index c530f34..6019cd1 100644
--- a/libstdc++-v3/include/bits/fstream.tcc
+++ b/libstdc++-v3/include/bits/fstream.tcc
@@ -567,7 +567,7 @@ namespace std
else
{
__ret = _M_file.seekoff(__off, ios_base::cur, __mode);
- __ret += _M_in_cur - _M_filepos;
+ __ret += max(_M_out_cur, _M_in_cur) - _M_filepos;
}
}
_M_last_overflowed = false;
diff --git a/libstdc++-v3/include/std/std_fstream.h b/libstdc++-v3/include/std/std_fstream.h
index c0d80da..0b20df1 100644
--- a/libstdc++-v3/include/std/std_fstream.h
+++ b/libstdc++-v3/include/std/std_fstream.h
@@ -264,7 +264,7 @@ namespace std
this->setg(_M_buf, _M_buf, _M_buf);
if (_M_mode & ios_base::out)
this->setp(_M_buf, _M_buf);
- _M_filepos = _M_in_end;
+ _M_filepos = _M_buf;
}
void
@@ -276,7 +276,7 @@ namespace std
this->setg(_M_buf, _M_buf, _M_buf + __off);
if (__testout)
this->setp(_M_buf, _M_buf + __off);
- _M_filepos = _M_in_end;
+ _M_filepos = _M_buf + __off;
}
bool
diff --git a/libstdc++-v3/testsuite/27_io/ostream_seeks.cc b/libstdc++-v3/testsuite/27_io/ostream_seeks.cc
index 7022a2f..5afc675 100644
--- a/libstdc++-v3/testsuite/27_io/ostream_seeks.cc
+++ b/libstdc++-v3/testsuite/27_io/ostream_seeks.cc
@@ -167,6 +167,13 @@ void test04(void)
pos06 = is03.tellp();
VERIFY( pos05 == pos06 );
+ // libstdc++/6414
+ if01.seekg(0, std::ios_base::beg);
+ pos01 = if01.tellg();
+ if01.peek();
+ pos02 = if01.tellg();
+ VERIFY( pos02 == pos01 );
+
#ifdef DEBUG_ASSERT
assert(test);
#endif