Add wchar_t counterparts of the basic_streambbuf<char> tests.
authorPaolo Carlini <pcarlini@suse.de>
Sun, 11 Jul 2004 19:13:59 +0000 (19:13 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sun, 11 Jul 2004 19:13:59 +0000 (19:13 +0000)
2004-07-11  Paolo Carlini  <pcarlini@suse.de>

Add wchar_t counterparts of the basic_streambbuf<char> tests.
* testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc: New.
* testsuite/27_io/basic_streambuf/imbue/wchar_t/1.cc, 9322.cc:
Likewise.
* testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc: Likewise.
* testsuite/27_io/basic_streambuf/overflow/wchar_t/1.cc, 2.cc,
3599.cc: Likewise.
* testsuite/27_io/basic_streambuf/sgetc/wchar_t/1.cc: Likewise.
* testsuite/27_io/basic_streambuf/sgetn/wchar_t/1.cc: Likewise.
* testsuite/27_io/basic_streambuf/sputbackc/wchar_t/9538.cc: Likewise.
* testsuite/27_io/basic_streambuf/sputc/wchar_t/1057.cc: Likewise.
* testsuite/27_io/basic_streambuf/sputn/wchar_t/1.cc, 1057.cc:
Likewise.
* testsuite/27_io/basic_streambuf/sync/wchar_t/1057.cc: Likewise.

* testsuite/27_io/basic_streambuf/imbue/char/1.cc, 9322.cc: Minor
tweaks.
* testsuite/27_io/basic_streambuf/overflow/char/2.cc, 3599.cc:
Likewise.
* testsuite/27_io/basic_streambuf/sputn/char/1057.cc: Likewise.
* testsuite/27_io/basic_streambuf/sync/char/1057.cc: Likewise.

From-SVN: r84526

21 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/char/1.cc
libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/char/9322.cc
libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/wchar_t/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/wchar_t/9322.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/char/2.cc
libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/char/3599.cc
libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/2.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/3599.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sgetc/wchar_t/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sgetn/wchar_t/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sputbackc/wchar_t/9538.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sputc/wchar_t/1057.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/char/1057.cc
libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/wchar_t/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/wchar_t/1057.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_streambuf/sync/char/1057.cc
libstdc++-v3/testsuite/27_io/basic_streambuf/sync/wchar_t/1057.cc [new file with mode: 0644]

index aeffd691d8f400c2ba997305188962fddcd54b04..f7a49d7c355b0919b6538ad1a5828daa8da58565 100644 (file)
@@ -1,3 +1,27 @@
+2004-07-11  Paolo Carlini  <pcarlini@suse.de>
+
+       Add wchar_t counterparts of the basic_streambbuf<char> tests.
+       * testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc: New.
+       * testsuite/27_io/basic_streambuf/imbue/wchar_t/1.cc, 9322.cc:
+       Likewise.
+       * testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/overflow/wchar_t/1.cc, 2.cc,
+       3599.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/sgetc/wchar_t/1.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/sgetn/wchar_t/1.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/sputbackc/wchar_t/9538.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/sputc/wchar_t/1057.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/sputn/wchar_t/1.cc, 1057.cc:
+       Likewise.
+       * testsuite/27_io/basic_streambuf/sync/wchar_t/1057.cc: Likewise.
+
+       * testsuite/27_io/basic_streambuf/imbue/char/1.cc, 9322.cc: Minor
+       tweaks.
+       * testsuite/27_io/basic_streambuf/overflow/char/2.cc, 3599.cc:
+       Likewise.
+       * testsuite/27_io/basic_streambuf/sputn/char/1057.cc: Likewise.
+       * testsuite/27_io/basic_streambuf/sync/char/1057.cc: Likewise.
+
 2004-07-11  Phil Edwards  <phil@codesourcery.com>
 
        * acinclude.m4:  Cosmetic shell syntax fixes.
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc
new file mode 100644 (file)
index 0000000..a97b35f
--- /dev/null
@@ -0,0 +1,111 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+
+  // Typedefs:
+  typedef std::wstreambuf::traits_type traits_type;
+  typedef std::wstreambuf::char_type char_type;
+
+  testbuf(): std::wstreambuf() 
+  { }
+
+  bool
+  check_pointers()
+  { 
+    bool test __attribute__((unused)) = true;
+    VERIFY( this->eback() == NULL );
+    VERIFY( this->gptr() == NULL );
+    VERIFY( this->egptr() == NULL );
+    VERIFY( this->pbase() == NULL );
+    VERIFY( this->pptr() == NULL );
+    VERIFY( this->epptr() == NULL );
+    return test;
+  }
+
+  int_type 
+  pub_uflow() 
+  { return (this->uflow()); }
+
+  int_type 
+  pub_overflow(int_type __c = traits_type::eof()) 
+  { return (this->overflow(__c)); }
+
+  int_type 
+  pub_pbackfail(int_type __c) 
+  { return (this->pbackfail(__c)); }
+
+  void 
+  pub_setg(wchar_t* beg, wchar_t* cur, wchar_t* end) 
+  { this->setg(beg, cur, end); }
+
+  void 
+  pub_setp(wchar_t* beg, wchar_t* end) 
+  { this->setp(beg, end); }
+
+protected:
+  int_type 
+  underflow() 
+  { 
+    int_type __retval = traits_type::eof();
+    if (this->gptr() < this->egptr())
+      __retval = traits_type::not_eof(0); 
+    return __retval;
+  }
+};
+
+void test01()
+{
+  typedef testbuf::traits_type traits_type;
+  typedef testbuf::int_type int_type;
+
+  bool test __attribute__((unused)) = true;
+  testbuf buf01;
+
+  // 27.5.2.1 basic_streambuf ctors
+  // default ctor initializes 
+  // - all pointer members to null pointers
+  // - locale to current global locale
+  VERIFY( buf01.check_pointers() );
+  VERIFY( buf01.getloc() == std::locale() );
+}
+
+int main() 
+{
+  test01();
+  return 0;
+}
index b574cdc6736b60294065085f01da1ae5dcf43a33..24469ba99de39a9c06b7ee5f11abe3f4293a0cd2 100644 (file)
@@ -20,6 +20,7 @@
 // USA.
 
 #include <streambuf>
+#include <locale>
 #include <testsuite_hooks.h>
 
 class testbuf : public std::streambuf
index 17d94af7001e493701d6cfb5fb9755e5accb8e8c..964fcca3cf3d9e494e879fbdd1819de84a02cf7e 100644 (file)
 
 // 27.5.2 template class basic_streambuf
 
-#include <cstring> // for memset, memcmp
 #include <streambuf>
-#include <sstream>
-#include <ostream>
+#include <locale>
 #include <testsuite_hooks.h>
 
 class testbuf : public std::streambuf
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/wchar_t/1.cc
new file mode 100644 (file)
index 0000000..3f735fd
--- /dev/null
@@ -0,0 +1,53 @@
+// 981208 bkoz test functionality of basic_streambuf for char_type == wchar_t
+
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+#include <streambuf>
+#include <locale>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+  typedef std::wstreambuf::traits_type traits_type;
+
+  testbuf() : std::wstreambuf() { }
+};
+
+// test the streambuf locale settings
+void test02() 
+{
+  testbuf buf;
+  std::locale loc_c = std::locale::classic();
+  loc_c = buf.getloc();
+  buf.pubimbue(loc_c); //This should initialize _M_init to true
+  std::locale loc_tmp = buf.getloc(); 
+  VERIFY( loc_tmp == loc_c );
+}
+
+int main()
+{
+  test02();
+  return 0;
+}
+
+
+
+// more candy!!!
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/wchar_t/9322.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/imbue/wchar_t/9322.cc
new file mode 100644 (file)
index 0000000..68a4678
--- /dev/null
@@ -0,0 +1,71 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <locale>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+  typedef std::wstreambuf::traits_type traits_type;
+
+  testbuf() : std::wstreambuf() { }
+};
+
+// libstdc++/9322
+void test08()
+{
+  using std::locale;
+  bool test __attribute__((unused)) = true;
+
+  locale loc;
+  testbuf ob;
+  VERIFY( ob.getloc() == loc );
+
+  locale::global(__gnu_test::try_named_locale("en_US"));
+  VERIFY( ob.getloc() == loc );
+
+  locale loc_de = __gnu_test::try_named_locale("de_DE");
+  locale ret = ob.pubimbue(loc_de);
+  VERIFY( ob.getloc() == loc_de );
+  VERIFY( ret == loc );
+
+  locale::global(loc);
+  VERIFY( ob.getloc() == loc_de );
+}
+
+int main() 
+{
+  test08();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc
new file mode 100644 (file)
index 0000000..239f790
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 27.5.2.2.3 Get area
+
+#include <fstream>
+#include <testsuite_hooks.h>
+
+class Derived_fbuf : public std::wfilebuf
+{
+public:
+  const char_type* pub_egptr() const
+  { return egptr(); }
+
+  const char_type* pub_gptr() const
+  { return gptr(); }
+};
+
+// libstdc++/9701 (in_avail)
+void test01()
+{
+  using namespace std;
+  bool test __attribute__((unused)) = true;
+  const char* name = "tmp_file1_w";
+
+  Derived_fbuf df2;
+  df2.open(name, ios_base::in | ios_base::out | ios_base::trunc);
+
+  df2.sputn(L"Comomoc", 7);
+
+  df2.pubseekoff(0, ios_base::beg);
+  df2.sbumpc();
+  df2.sputbackc(L't');
+
+  VERIFY( df2.pub_gptr() < df2.pub_egptr() );
+  VERIFY( df2.in_avail() == df2.pub_egptr() - df2.pub_gptr() );
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
index a62155292511184451d52c03e81f7104e7653be5..dbf79bd384a7747bd945cadd12de7eb0767f6dfa 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <streambuf>
 #include <ostream>
+#include <string>
 #include <testsuite_hooks.h>
 
 // test03
index 145e4eb3ec66e4af2ddc2c6b472fcb53045c86ab..82040cdf3428b14fce1f82bf27c93ef2ab0925d4 100644 (file)
@@ -55,10 +55,10 @@ test07()
   std::ostream out(&ob); 
 
   out << "gasp";
-  VERIFY(out.good());
+  VERIFY( out.good() );
 
   out << std::endl;
-  VERIFY(out.good());
+  VERIFY( out.good() );
 }
 
 int main() 
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/1.cc
new file mode 100644 (file)
index 0000000..0bada3a
--- /dev/null
@@ -0,0 +1,119 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <cwchar>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+
+  // Typedefs:
+  typedef std::wstreambuf::traits_type traits_type;
+  typedef std::wstreambuf::char_type char_type;
+
+  testbuf(): std::wstreambuf() 
+  { }
+
+  bool
+  check_pointers()
+  { 
+    bool test __attribute__((unused)) = true;
+    VERIFY( this->eback() == NULL );
+    VERIFY( this->gptr() == NULL );
+    VERIFY( this->egptr() == NULL );
+    VERIFY( this->pbase() == NULL );
+    VERIFY( this->pptr() == NULL );
+    VERIFY( this->epptr() == NULL );
+    return test;
+  }
+
+  int_type 
+  pub_uflow() 
+  { return (this->uflow()); }
+
+  int_type 
+  pub_overflow(int_type __c = traits_type::eof()) 
+  { return (this->overflow(__c)); }
+
+  int_type 
+  pub_pbackfail(int_type __c) 
+  { return (this->pbackfail(__c)); }
+
+  void 
+  pub_setg(wchar_t* beg, wchar_t* cur, wchar_t* end) 
+  { this->setg(beg, cur, end); }
+
+  void 
+  pub_setp(wchar_t* beg, wchar_t* end) 
+  { this->setp(beg, end); }
+
+protected:
+  int_type 
+  underflow() 
+  { 
+    int_type __retval = traits_type::eof();
+    if (this->gptr() < this->egptr())
+      __retval = traits_type::not_eof(0); 
+    return __retval;
+  }
+};
+
+void test01()
+{
+  typedef testbuf::traits_type traits_type;
+  typedef testbuf::int_type int_type;
+
+  bool test __attribute__((unused)) = true;
+  wchar_t lit01[52];
+  std::wcscpy(lit01, L"chicago underground trio/possible cube on delmark");
+  testbuf buf01;
+
+  // pbackfail
+  int i01 = 3;
+  buf01.pub_setg(lit01, lit01, (lit01 + i01));
+  VERIFY( i01 == buf01.in_avail() );
+  int_type intt01 = traits_type::to_int_type(L'b');
+  VERIFY( traits_type::eof() == buf01.pub_pbackfail(intt01) );
+
+  // overflow
+  VERIFY( traits_type::eof() == buf01.pub_overflow(intt01) );
+  VERIFY( traits_type::eof() == buf01.pub_overflow() );
+  VERIFY( buf01.sgetc() == traits_type::to_int_type(lit01[0]) );
+}
+
+int main() 
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/2.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/2.cc
new file mode 100644 (file)
index 0000000..87a650c
--- /dev/null
@@ -0,0 +1,81 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <ostream>
+#include <string>
+#include <testsuite_hooks.h>
+
+// test03
+// http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00151.html
+template<typename charT, typename traits = std::char_traits<charT> >
+  class basic_nullbuf : public std::basic_streambuf<charT, traits>
+  {
+  protected:
+    typedef typename
+      std::basic_streambuf<charT, traits>::int_type int_type;
+    virtual int_type 
+    overflow(int_type c) 
+    {  return traits::not_eof(c); }
+  };
+
+typedef basic_nullbuf<wchar_t> nullbuf;
+
+template<typename T>
+  wchar_t
+  print(const T& x) 
+  {
+   nullbuf ob;
+   std::wostream out(&ob); 
+   out << x << std::endl;
+   return (!out ? L'0' : L'1');
+ }
+
+void test03() 
+{
+  bool test __attribute__((unused)) = true;
+  const std::wstring control01(L"11111");
+  std::wstring test01;
+
+  test01 += print(true);
+  test01 += print(3.14159);
+  test01 += print(10);
+  test01 += print(L'x');
+  test01 += print(L"pipo");
+
+  VERIFY( test01 == control01 );
+}
+
+int main() 
+{
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/3599.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/overflow/wchar_t/3599.cc
new file mode 100644 (file)
index 0000000..b0dcd16
--- /dev/null
@@ -0,0 +1,68 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <ostream>
+#include <testsuite_hooks.h>
+
+// libstdc++/3599
+class testbuf : public std::wstreambuf
+{
+public:
+  typedef std::wstreambuf::traits_type traits_type;
+
+  testbuf() : std::wstreambuf() { }
+protected:
+  int_type 
+  overflow(int_type c __attribute__((unused)) = traits_type::eof()) 
+  { return traits_type::not_eof(0); }
+};
+
+void
+test07()
+{
+  bool test __attribute__((unused)) = true;
+  testbuf ob;
+  std::wostream out(&ob); 
+
+  out << L"gasp";
+  VERIFY( out.good() );
+
+  out << std::endl;
+  VERIFY( out.good() );
+}
+
+int main() 
+{
+  test07();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sgetc/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sgetc/wchar_t/1.cc
new file mode 100644 (file)
index 0000000..1b0137e
--- /dev/null
@@ -0,0 +1,121 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <cwchar>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+
+  // Typedefs:
+  typedef std::wstreambuf::traits_type traits_type;
+  typedef std::wstreambuf::char_type char_type;
+
+  testbuf(): std::wstreambuf() 
+  { }
+
+  bool
+  check_pointers()
+  { 
+    bool test __attribute__((unused)) = true;
+    VERIFY( this->eback() == NULL );
+    VERIFY( this->gptr() == NULL );
+    VERIFY( this->egptr() == NULL );
+    VERIFY( this->pbase() == NULL );
+    VERIFY( this->pptr() == NULL );
+    VERIFY( this->epptr() == NULL );
+    return test;
+  }
+
+  int_type 
+  pub_uflow() 
+  { return (this->uflow()); }
+
+  int_type 
+  pub_overflow(int_type __c = traits_type::eof()) 
+  { return (this->overflow(__c)); }
+
+  int_type 
+  pub_pbackfail(int_type __c) 
+  { return (this->pbackfail(__c)); }
+
+  void 
+  pub_setg(wchar_t* beg, wchar_t* cur, wchar_t* end) 
+  { this->setg(beg, cur, end); }
+
+  void 
+  pub_setp(wchar_t* beg, wchar_t* end)
+  { this->setp(beg, end); }
+
+protected:
+  int_type 
+  underflow() 
+  { 
+    int_type __retval = traits_type::eof();
+    if (this->gptr() < this->egptr())
+      __retval = traits_type::not_eof(0); 
+    return __retval;
+  }
+};
+
+void test01()
+{
+  typedef testbuf::traits_type traits_type;
+  typedef testbuf::int_type int_type;
+
+  bool test __attribute__((unused)) = true;
+  wchar_t lit01[52];
+  std::wcscpy(lit01, L"chicago underground trio/possible cube on delmark");
+  testbuf buf01;
+
+  // 27.5.2.3.1 get area
+  // 27.5.2.2.3 get area
+  // 27.5.2.4.3 get area
+  int i01 = 3;
+  buf01.pub_setg(lit01, lit01, (lit01 + i01));
+  VERIFY( i01 == buf01.in_avail() );
+
+  VERIFY( buf01.pub_uflow() == lit01[0] );
+  VERIFY( buf01.sgetc() == traits_type::to_int_type(lit01[1]) );
+  VERIFY( buf01.pub_uflow() == lit01[1] );
+  VERIFY( buf01.sgetc() == traits_type::to_int_type(lit01[2]) );
+  VERIFY( buf01.pub_uflow() == lit01[2] );
+  VERIFY( buf01.sgetc() == traits_type::eof() );
+}
+
+int main() 
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sgetn/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sgetn/wchar_t/1.cc
new file mode 100644 (file)
index 0000000..d67f94a
--- /dev/null
@@ -0,0 +1,133 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <cwchar>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+
+  // Typedefs:
+  typedef std::wstreambuf::traits_type traits_type;
+  typedef std::wstreambuf::char_type char_type;
+
+  testbuf(): std::wstreambuf() 
+  { }
+
+  bool
+  check_pointers()
+  { 
+    bool test __attribute__((unused)) = true;
+    VERIFY( this->eback() == NULL );
+    VERIFY( this->gptr() == NULL );
+    VERIFY( this->egptr() == NULL );
+    VERIFY( this->pbase() == NULL );
+    VERIFY( this->pptr() == NULL );
+    VERIFY( this->epptr() == NULL );
+    return test;
+  }
+
+  int_type 
+  pub_uflow() 
+  { return (this->uflow()); }
+
+  int_type 
+  pub_overflow(int_type __c = traits_type::eof()) 
+  { return (this->overflow(__c)); }
+
+  int_type 
+  pub_pbackfail(int_type __c) 
+  { return (this->pbackfail(__c)); }
+
+  void 
+  pub_setg(wchar_t* beg, wchar_t* cur, wchar_t* end) 
+  { this->setg(beg, cur, end); }
+
+  void 
+  pub_setp(wchar_t* beg, wchar_t* end) 
+  { this->setp(beg, end); }
+
+protected:
+  int_type 
+  underflow() 
+  { 
+    int_type __retval = traits_type::eof();
+    if (this->gptr() < this->egptr())
+      __retval = traits_type::not_eof(0); 
+    return __retval;
+  }
+};
+
+void test02()
+{
+  typedef testbuf::traits_type traits_type;
+  typedef testbuf::int_type int_type;
+
+  bool test __attribute__((unused)) = true;
+
+  const wchar_t* lit00 = L"chicago underground trio/possible cube on delmark";
+  size_t i01 = traits_type::length(lit00);
+  wchar_t lit01[i01];
+  std::wcscpy(lit01, lit00);
+
+  testbuf buf01;
+
+  // 27.5.2.1 basic_streambuf ctors
+  // default ctor initializes 
+  // - all pointer members to null pointers
+  // - locale to current global locale
+  VERIFY( buf01.check_pointers() );
+  VERIFY( buf01.getloc() == std::locale() );
+
+  // 27.5.2.2.5 Put area
+
+  wchar_t carray01[i01];
+  std::wmemset(carray01, 0, i01);
+  
+  buf01.pub_setg(lit01, lit01, lit01 + i01);
+  buf01.sgetn(carray01, 0);
+  VERIFY( carray01[0] == 0 );
+  buf01.sgetn(carray01, 1);
+  VERIFY( carray01[0] == L'c' );
+  buf01.sgetn(carray01 + 1, i01 - 1);
+  VERIFY( carray01[0] == L'c' );
+  VERIFY( carray01[1] == L'h' );
+  VERIFY( carray01[i01 - 1] == L'k' );
+}
+
+int main() 
+{
+  test02();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sputbackc/wchar_t/9538.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sputbackc/wchar_t/9538.cc
new file mode 100644 (file)
index 0000000..19e794d
--- /dev/null
@@ -0,0 +1,66 @@
+// 2001-05-21 Benjamin Kosnik  <bkoz@redhat.com>
+
+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 27.8.1.4 Overridden virtual functions
+
+#include <streambuf>
+#include <locale>
+#include <cwchar>
+#include <testsuite_hooks.h>
+
+class MyTraits : public std::char_traits<wchar_t>
+{
+public:
+  static bool eq(wchar_t c1, wchar_t c2)
+  {
+    bool test __attribute__((unused)) = true;
+    VERIFY( c1 != L'X' );
+    VERIFY( c2 != L'X' );
+    return std::char_traits<wchar_t>::eq(c1, c2);
+  }
+};
+
+class MyBuf : public std::basic_streambuf<wchar_t, MyTraits>
+{
+  wchar_t buffer[8];
+
+public:
+  MyBuf()
+  {
+    std::wmemset(buffer, L'X', sizeof(buffer) / sizeof(buffer[0]));
+    std::wmemset(buffer + 2, L'f', 4);
+    setg(buffer + 2, buffer + 2, buffer + 6);
+  }
+};
+
+// libstdc++/9538
+void test08()
+{
+  bool test __attribute__((unused)) = true;
+
+  MyBuf mb;
+  mb.sputbackc(L'a');
+}
+
+int main() 
+{
+  test08();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sputc/wchar_t/1057.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sputc/wchar_t/1057.cc
new file mode 100644 (file)
index 0000000..01dc431
--- /dev/null
@@ -0,0 +1,62 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <string>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+class nullsetpbuf : public std::wstreambuf
+{
+  wchar_t foo[64];
+public:
+  nullsetpbuf()
+  {
+    setp(foo, foo + 64);
+    setp(NULL, NULL);
+  }
+};
+
+// libstdc++/1057
+void test05()
+{
+  std::wstring text1 = L"abcdefghijklmn";
+  
+  nullsetpbuf nsp;
+  // Immediate crash as sputc writes to null pointer
+  nsp.sputc(L'a');
+}
+
+int main() 
+{
+  test05();
+  return 0;
+}
index 628e2e77d73b74ff817f7aab6c29585e93693561..f3b40500a8a75fc7961de54e00479d562c441577 100644 (file)
@@ -30,7 +30,7 @@
 // 27.5.2 template class basic_streambuf
 
 #include <streambuf>
-#include <sstream>
+#include <string>
 #include <testsuite_hooks.h>
 
 class nullsetpbuf : public std::streambuf
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/wchar_t/1.cc
new file mode 100644 (file)
index 0000000..d638b79
--- /dev/null
@@ -0,0 +1,127 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <cwchar>
+#include <testsuite_hooks.h>
+
+class testbuf : public std::wstreambuf
+{
+public:
+
+  // Typedefs:
+  typedef std::wstreambuf::traits_type traits_type;
+  typedef std::wstreambuf::char_type char_type;
+
+  testbuf(): std::wstreambuf() 
+  { }
+
+  bool
+  check_pointers()
+  { 
+    bool test __attribute__((unused)) = true;
+    VERIFY( this->eback() == NULL );
+    VERIFY( this->gptr() == NULL );
+    VERIFY( this->egptr() == NULL );
+    VERIFY( this->pbase() == NULL );
+    VERIFY( this->pptr() == NULL );
+    VERIFY( this->epptr() == NULL );
+    return test;
+  }
+
+  int_type 
+  pub_uflow() 
+  { return (this->uflow()); }
+
+  int_type 
+  pub_overflow(int_type __c = traits_type::eof()) 
+  { return (this->overflow(__c)); }
+
+  int_type 
+  pub_pbackfail(int_type __c) 
+  { return (this->pbackfail(__c)); }
+
+  void 
+  pub_setg(wchar_t* beg, wchar_t* cur, wchar_t* end) 
+  { this->setg(beg, cur, end); }
+
+  void 
+  pub_setp(wchar_t* beg, wchar_t* end)
+  { this->setp(beg, end); }
+
+protected:
+  int_type 
+  underflow() 
+  { 
+    int_type __retval = traits_type::eof();
+    if (this->gptr() < this->egptr())
+      __retval = traits_type::not_eof(0); 
+    return __retval;
+  }
+};
+
+void test01()
+{
+  typedef testbuf::traits_type traits_type;
+  typedef testbuf::int_type int_type;
+
+  bool test __attribute__((unused)) = true;
+  testbuf buf01;
+
+  // sputn/xsputn
+  const wchar_t* lit01 = L"isotope 217: the unstable molecule on thrill jockey";
+  const int i02 = std::wcslen(lit01);
+  wchar_t lit02[i02];
+  std::wcscpy(lit02, lit01);
+
+  wchar_t carray[i02 + 1];
+  std::wmemset(carray, 0, i02 + 1);
+
+  buf01.pub_setp(carray, (carray + i02));
+  buf01.sputn(lit02, 0);
+  VERIFY( carray[0] == 0 );
+  VERIFY( lit02[0] == L'i' );
+  buf01.sputn(lit02, 1);
+  VERIFY( lit02[0] == carray[0] );
+  VERIFY( lit02[1] == L's' );
+  VERIFY( carray[1] == 0 );
+  buf01.sputn(lit02 + 1, 10);
+  VERIFY( std::memcmp(lit02, carray, 10) == 0 );
+  buf01.sputn(lit02 + 11, 20);
+  VERIFY( std::memcmp(lit02, carray, 30) == 0 );
+}
+
+int main() 
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/wchar_t/1057.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sputn/wchar_t/1057.cc
new file mode 100644 (file)
index 0000000..d25b015
--- /dev/null
@@ -0,0 +1,62 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <string>
+#include <testsuite_hooks.h>
+
+class nullsetpbuf : public std::wstreambuf
+{
+  wchar_t foo[64];
+public:
+  nullsetpbuf()
+  {
+    setp(foo, foo + 64);
+    setp(NULL, NULL);
+  }
+};
+
+// libstdc++/1057
+void test05()
+{
+  std::wstring text1 = L"abcdefghijklmn";
+  
+  nullsetpbuf nsp;
+  // Immediate crash as xsputn writes to null pointer
+  nsp.sputn(text1.c_str(), text1.length());
+}
+
+int main() 
+{
+  test05();
+  return 0;
+}
index 5c75185774b53556852476c220fc546f6ce8f55b..9bc2ac00664b7425cdf1902adb080cc14665e3ed 100644 (file)
@@ -30,6 +30,7 @@
 // 27.5.2 template class basic_streambuf
 
 #include <streambuf>
+#include <string>
 #include <testsuite_hooks.h>
 
 class setpbuf : public std::streambuf
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/sync/wchar_t/1057.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/sync/wchar_t/1057.cc
new file mode 100644 (file)
index 0000000..5877cc1
--- /dev/null
@@ -0,0 +1,110 @@
+// 1999-10-11 bkoz
+
+// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+// 27.5.2 template class basic_streambuf
+
+#include <streambuf>
+#include <string>
+#include <testsuite_hooks.h>
+
+class setpbuf : public std::wstreambuf
+{
+  wchar_t      buffer[4];
+  std::wstring         result;
+
+public:
+
+  std::wstring&
+  get_result()
+  { return result; }
+
+  setpbuf()
+  {
+    wchar_t foo[32];
+    setp(foo, foo + 32);
+    setp(buffer, buffer + 4);
+  }
+
+  ~setpbuf()
+  { sync(); }
+
+  virtual int_type 
+  overflow(int_type n)
+  {
+    if (sync() != 0)
+      return traits_type::eof();
+    
+    result += traits_type::to_char_type(n);
+    
+    return n;
+  }
+  
+  virtual int 
+  sync()
+  {
+    result.append(pbase(), pptr());
+    setp(buffer, buffer + 4);
+    return 0;
+  }
+};
+
+// libstdc++/1057
+void test04()
+{
+  bool test __attribute__((unused)) = true;
+  std::wstring text = L"abcdefghijklmn";
+  
+  // 01
+  setpbuf sp1;
+  // Here xsputn writes over sp1.result
+  sp1.sputn(text.c_str(), text.length());
+
+  // This crashes when result is accessed
+  sp1.pubsync();
+  VERIFY( sp1.get_result() == text );
+  
+  // 02
+  setpbuf sp2;
+  for (std::wstring::size_type i = 0; i < text.length(); ++i)
+    {
+      // sputc also writes over result
+      sp2.sputc(text[i]);
+    }
+  
+  // Crash here
+  sp2.pubsync();
+  VERIFY( sp2.get_result() == text );
+}
+
+int main() 
+{
+  test04();
+  return 0;
+}