re PR libstdc++/9318 (i/ostream::operator>>/<<(streambuf*) broken)

2003-02-11  Paolo Carlini  <pcarlini@unitus.it>
	    Petur Runolfsson  <peturr02@ru.is>

	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 <peturr02@ru.is>

From-SVN: r62689
This commit is contained in:
Paolo Carlini 2003-02-11 10:59:19 +01:00 committed by Paolo Carlini
parent 194ea9ced6
commit da61d02231
3 changed files with 58 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2003-02-11 Paolo Carlini <pcarlini@unitus.it>
Petur Runolfsson <peturr02@ru.is>
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 <dj@redhat.com>
* acinclude.m4: Check for native targets that can't link at

View File

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

View File

@ -31,7 +31,7 @@
#include <cstring> // for memset, memcmp
#include <streambuf>
#include <string>
#include <sstream>
#include <ostream>
#include <testsuite_hooks.h>
@ -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;
}