re PR libstdc++/9318 (i/ostream::operator>>/<<(streambuf*) broken)
authorPaolo Carlini <pcarlini@unitus.it>
Tue, 11 Feb 2003 09:59:19 +0000 (10:59 +0100)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 11 Feb 2003 09:59:19 +0000 (09:59 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/streambuf.tcc
libstdc++-v3/testsuite/27_io/streambuf_members.cc

index 2712b3a13a32de658bbada55db468b3cf169f797..9816498714b1099d40b039ce0919026685f6fd5d 100644 (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
index cb6f95deea4d8db30a9133652f9593534018355d..44ba1d9d5752cd73a5d83e7010c867c9cf96d527 100644 (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()) 
index aaad07dc47ff7a07e633c06041f3e4c360633780..80f569d807497826cbe304101ffb7f5a7042aac7 100644 (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;
 }