aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2003-02-24 21:39:31 +0100
committerPaolo Carlini <paolo@gcc.gnu.org>2003-02-24 20:39:31 +0000
commit57df94c8f6a7bf0a9e0ccf8bf0d81a4d16514a12 (patch)
treea7ad6d88a092d0335e69d0a93702ee68bb891066
parent2bac97f7e74adbe7a5a0a966a716f3facd65fb07 (diff)
downloadgcc-57df94c8f6a7bf0a9e0ccf8bf0d81a4d16514a12.zip
gcc-57df94c8f6a7bf0a9e0ccf8bf0d81a4d16514a12.tar.gz
gcc-57df94c8f6a7bf0a9e0ccf8bf0d81a4d16514a12.tar.bz2
re PR libstdc++/9825 (filebuf::sputbackc breaks sbumpc)
2003-02-24 Paolo Carlini <pcarlini@unitus.it> PR libstdc++/9825 * src/fstream.cc (basic_filebuf<char/wchar_t>::_M_underflow_common): When __bump is true (uflow), always increment the read pointer (_M_in_cur) before returning successfully. * testsuite/27_io/filebuf_virtuals.cc (test12): Add. From-SVN: r63378
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/src/fstream.cc14
-rw-r--r--libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc24
3 files changed, 45 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 30d0c0c..158f4b2 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2003-02-24 Paolo Carlini <pcarlini@unitus.it>
+
+ PR libstdc++/9825
+ * src/fstream.cc
+ (basic_filebuf<char/wchar_t>::_M_underflow_common): When
+ __bump is true (uflow), always increment the read pointer
+ (_M_in_cur) before returning successfully.
+ * testsuite/27_io/filebuf_virtuals.cc (test12): Add.
+
2003-02-24 Paolo Carlini <pcarlini@unitus.it>
Nathan Myers <ncm@cantrip.org>
diff --git a/libstdc++-v3/src/fstream.cc b/libstdc++-v3/src/fstream.cc
index 944bae2..5753e00 100644
--- a/libstdc++-v3/src/fstream.cc
+++ b/libstdc++-v3/src/fstream.cc
@@ -53,7 +53,12 @@ namespace std
{
_M_pback_destroy();
if (_M_in_cur < _M_in_end)
- return traits_type::to_int_type(*_M_in_cur);
+ {
+ __ret = traits_type::to_int_type(*_M_in_cur);
+ if (__bump)
+ _M_in_cur_move(1);
+ return __ret;
+ }
}
// Sync internal and external buffers.
@@ -128,7 +133,12 @@ namespace std
{
_M_pback_destroy();
if (_M_in_cur < _M_in_end)
- return traits_type::to_int_type(*_M_in_cur);
+ {
+ __ret = traits_type::to_int_type(*_M_in_cur);
+ if (__bump)
+ _M_in_cur_move(1);
+ return __ret;
+ }
}
// Sync internal and external buffers.
diff --git a/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc b/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
index fc9262f..660abd1 100644
--- a/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
+++ b/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
@@ -73,6 +73,7 @@ const char name_02[] = "filebuf_virtuals-2.txt"; // empty file, need to create
const char name_03[] = "filebuf_virtuals-3.txt"; // empty file, need to create
const char name_04[] = "filebuf_virtuals-4.txt"; // empty file, need to create
const char name_05[] = "filebuf_virtuals-5.txt"; // empty file, need to create
+const char name_06[] = "filebuf_virtuals-6.txt"; // empty file, need to create
class derived_filebuf: public std::filebuf
{
@@ -681,6 +682,28 @@ void test11()
dfbuf_02.close();
}
+// libstdc++/9825
+void test12()
+{
+ using namespace std;
+ bool test = true;
+
+ filebuf fbuf;
+
+ fbuf.open(name_06, ios_base::in|ios_base::out|ios_base::trunc);
+ fbuf.sputn("crazy bees!", 11);
+ fbuf.pubseekoff(0, ios_base::beg);
+ fbuf.sbumpc();
+ fbuf.sputbackc('x');
+ filebuf::int_type c = fbuf.sbumpc();
+ VERIFY( c == 'x' );
+ c = fbuf.sbumpc();
+ VERIFY( c == 'r' );
+ c = fbuf.sbumpc();
+ VERIFY( c == 'a' );
+ fbuf.close();
+}
+
main()
{
test01();
@@ -696,5 +719,6 @@ main()
test09();
test10();
test11();
+ test12();
return 0;
}