From da61d02231ca20ebc788ad86655952cff1781171 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 11 Feb 2003 10:59:19 +0100 Subject: [PATCH] re PR libstdc++/9318 (i/ostream::operator>>/<<(streambuf*) broken) 2003-02-11 Paolo Carlini Petur Runolfsson PR libstdc++/9318 * include/bits/streambuf.tcc (__copy_streambufs): Don't conditionalize the copy to __testput. * testsuite/27_io/streambuf_members.cc (test09, test10): Add. Co-Authored-By: Petur Runolfsson From-SVN: r62689 --- libstdc++-v3/ChangeLog | 8 +++ libstdc++-v3/include/bits/streambuf.tcc | 3 +- .../testsuite/27_io/streambuf_members.cc | 50 ++++++++++++++++++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2712b3a13a3..9816498714b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2003-02-11 Paolo Carlini + Petur Runolfsson + + PR libstdc++/9318 + * include/bits/streambuf.tcc (__copy_streambufs): + Don't conditionalize the copy to __testput. + * testsuite/27_io/streambuf_members.cc (test09, test10): Add. + 2002-02-11 DJ Delorie * acinclude.m4: Check for native targets that can't link at diff --git a/libstdc++-v3/include/bits/streambuf.tcc b/libstdc++-v3/include/bits/streambuf.tcc index cb6f95deea4..44ba1d9d575 100644 --- a/libstdc++-v3/include/bits/streambuf.tcc +++ b/libstdc++-v3/include/bits/streambuf.tcc @@ -203,10 +203,9 @@ namespace std streamsize __ret = 0; streamsize __bufsize = __sbin->in_avail(); streamsize __xtrct; - bool __testput = __sbout->_M_mode & ios_base::out; try { - while (__testput && __bufsize != -1) + while (__bufsize != -1) { if (__bufsize != 0 && __sbin->gptr() != NULL && __sbin->gptr() + __bufsize <= __sbin->egptr()) diff --git a/libstdc++-v3/testsuite/27_io/streambuf_members.cc b/libstdc++-v3/testsuite/27_io/streambuf_members.cc index aaad07dc47f..80f569d8074 100644 --- a/libstdc++-v3/testsuite/27_io/streambuf_members.cc +++ b/libstdc++-v3/testsuite/27_io/streambuf_members.cc @@ -31,7 +31,7 @@ #include // for memset, memcmp #include -#include +#include #include #include @@ -386,6 +386,51 @@ void test08() VERIFY( ob.getloc() == loc_de ); } +// libstdc++/9318 +class Outbuf : public std::streambuf +{ +public: + typedef std::streambuf::traits_type traits_type; + + std::string result() const { return str; } + +protected: + virtual int_type overflow(int_type c = traits_type::eof()) + { + if (!traits_type::eq_int_type(c, traits_type::eof())) + str.push_back(traits_type::to_char_type(c)); + return traits_type::not_eof(c); + } + +private: + std::string str; +}; + +// <1> +void test09() +{ + bool test = true; + + std::istringstream stream("Bad Moon Rising"); + Outbuf buf; + stream >> &buf; + + VERIFY( buf.result() == "Bad Moon Rising" ); +} + +// <2> +void test10() +{ + bool test = true; + + std::stringbuf sbuf("Bad Moon Rising", std::ios::in); + Outbuf buf; + std::ostream stream(&buf); + stream << &sbuf; + + VERIFY( buf.result() == "Bad Moon Rising" ); +} + int main() { test01(); @@ -397,5 +442,8 @@ int main() test07(); test08(); + + test09(); + test10(); return 0; } -- 2.30.2