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
This commit is contained in:
Paolo Carlini 2003-02-24 21:39:31 +01:00 committed by Paolo Carlini
parent 2bac97f7e7
commit 57df94c8f6
3 changed files with 45 additions and 2 deletions

View File

@ -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>

View File

@ -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.

View File

@ -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;
}