This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] Fix libstdc++/9825
- From: Paolo Carlini <pcarlini at unitus dot it>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 24 Feb 2003 21:41:00 +0100
- Subject: [v3] Fix libstdc++/9825
Hi!
approved by Benjamin, mainline and (soon) 3_3.
Paolo.
//////////
2003-02-24 Paolo Carlini <pcarlini at unitus dot 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.
diff -urN libstdc++-v3-orig/src/fstream.cc libstdc++-v3/src/fstream.cc
--- libstdc++-v3-orig/src/fstream.cc 2003-02-17 20:22:11.000000000 +0100
+++ libstdc++-v3/src/fstream.cc 2003-02-24 14:26:00.000000000 +0100
@@ -53,7 +53,12 @@
{
_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 @@
{
_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 -urN libstdc++-v3-orig/testsuite/27_io/filebuf_virtuals.cc libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
--- libstdc++-v3-orig/testsuite/27_io/filebuf_virtuals.cc 2003-02-24 19:43:01.000000000 +0100
+++ libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc 2003-02-24 20:20:24.000000000 +0100
@@ -73,6 +73,7 @@
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 @@
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 @@
test09();
test10();
test11();
+ test12();
return 0;
}