diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2003-02-12 20:39:19 +0100 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2003-02-12 19:39:19 +0000 |
commit | ff5d863fc262628cff60780e39c077fc897310d7 (patch) | |
tree | 189943f8946e67b013c29727d5024f7450b66902 /libstdc++-v3 | |
parent | 55ae46b15fcf6a31291fd793f8819207a70e0bbb (diff) | |
download | gcc-ff5d863fc262628cff60780e39c077fc897310d7.zip gcc-ff5d863fc262628cff60780e39c077fc897310d7.tar.gz gcc-ff5d863fc262628cff60780e39c077fc897310d7.tar.bz2 |
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/ostream.tcc | 16 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/ostream_sentry.cc | 32 |
3 files changed, 51 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d91f7bf..1cefd52 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +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. diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index b5b8762..3456e67 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -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> diff --git a/libstdc++-v3/testsuite/27_io/ostream_sentry.cc b/libstdc++-v3/testsuite/27_io/ostream_sentry.cc index cba75f2..322dbc5 100644 --- a/libstdc++-v3/testsuite/27_io/ostream_sentry.cc +++ b/libstdc++-v3/testsuite/27_io/ostream_sentry.cc @@ -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; } |