Commit ff5d863f by Paolo Carlini Committed by Paolo Carlini

re PR libstdc++/9563 (ostream::sentry returns true after a failed preparation)

2003-02-12  Paolo Carlini  <pcarlini@unitus.it>

	PR libstdc++/9563
	* include/bits/ostream.tcc (sentry::sentry): Check
	the state of the stream after the preparation.
	* testsuite/27_io/ostream_sentry.cc (test02): Add.

From-SVN: r62779
parent 55ae46b1
2003-02-12 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/9563
* include/bits/ostream.tcc (sentry::sentry): Check
the state of the stream after the preparation.
* testsuite/27_io/ostream_sentry.cc (test02): Add.
2003-02-11 Benjamin Kosnik <bkoz@redhat.com>
* include/Makefile.am (stamp-std-precompile): Add rule.
......
......@@ -41,11 +41,19 @@ namespace std
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>::sentry::
sentry(basic_ostream<_CharT,_Traits>& __os)
: _M_ok(__os.good()), _M_os(__os)
: _M_os(__os)
{
// XXX MT
if (_M_ok && __os.tie())
__os.tie()->flush();
// XXX MT
if (__os.good() && __os.tie())
__os.tie()->flush();
if (__os.good())
_M_ok = true;
else
{
_M_ok = false;
__os.setstate(ios_base::failbit);
}
}
template<typename _CharT, typename _Traits>
......
......@@ -46,8 +46,40 @@ test01()
VERIFY( bool(sentry1) == true );
}
// libstdc++/9563
struct buf: std::streambuf
{
std::ios *io_;
buf (std::ios *io): io_ (io) { }
virtual int sync ()
{
io_->setstate (std::ios::failbit);
return 0;
}
};
void
test02()
{
bool test = true;
buf b(0);
std::ostream strm(&b);
buf tb(&strm);
std::ostream tied(&tb);
strm.tie(&tied);
std::ostream::sentry s(strm);
VERIFY( !s );
}
int main()
{
test01();
test02();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment