This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] libstdc++/7216


Implements DR 271 for basic_iostream, resolves inherited typedef issues.

I took the liberty of doing a sanity-check for typedefs in 27_io as
part of this: as such, the bulk of this patch is testsuite work.  This
basically brings the 22_locale typedef tests to the 27_io directory in
a consistent way. It should also pave the way for some kind of tests
based on the jack reeves bug reports (traits_type != integral type).

I expect to resume work on this last issue now that new GNATS reports
are for the most part triaged.

tested x86/linux

quequed for gcc-3_1-branch

2002-07-25  Benjamin Kosnik  <bkoz@redhat.com>

	PR libstdc++/7216
	* include/std/std_istream.h (basic_iostream): Add typedefs for
	char_type, int_type, pos_type, off_type, and traits_type.
	* testsuite/27_io/iostream.cc (test01): Add typedef tests.
	* testsuite/27_io/istream.cc: Same.
	* testsuite/27_io/ostream.cc: Same.
	* testsuite/27_io/filebuf.cc: Same.
	* testsuite/27_io/stringbuf.cc: Replace content, move to...
	* testsuite/27_io/stringbuf_members.cc: ...here.	
	* testsuite/27_io/streambuf.cc: Replace content, move to...
	* testsuite/27_io/streambuf_members.cc: ...here.	
	* testsuite/27_io/stringstream.cc: Replace content, move to...
	* testsuite/27_io/stringstream_members.cc: ...here.
	* testsuite/27_io/ios.cc: New file.
	* testsuite/27_io/fstream.cc: New file.
	* testsuite/27_io/ifstream.cc: New file.	
	* testsuite/27_io/ofstream.cc: New file.		
	* testsuite/27_io/istringstream.cc: New file.	


Index: include/std/std_istream.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/std/std_istream.h,v
retrieving revision 1.3
diff -c -p -r1.3 std_istream.h
*** include/std/std_istream.h	16 Feb 2002 00:19:13 -0000	1.3
--- include/std/std_istream.h	26 Jul 2002 01:28:09 -0000
*************** namespace std
*** 261,266 ****
--- 261,276 ----
        public basic_ostream<_CharT, _Traits>
      {
      public:
+ #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
+ // 271. basic_iostream missing typedefs
+       // Types (inherited):
+       typedef _CharT                     		char_type;
+       typedef typename _Traits::int_type 		int_type;
+       typedef typename _Traits::pos_type 		pos_type;
+       typedef typename _Traits::off_type 		off_type;
+       typedef _Traits                    		traits_type;
+ #endif
+ 
        // Non-standard Types:
        typedef basic_istream<_CharT, _Traits>		__istream_type;
        typedef basic_ostream<_CharT, _Traits>		__ostream_type;
Index: testsuite/27_io/filebuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/filebuf.cc,v
retrieving revision 1.18
diff -c -p -r1.18 filebuf.cc
*** testsuite/27_io/filebuf.cc	26 Jan 2002 01:55:09 -0000	1.18
--- testsuite/27_io/filebuf.cc	26 Jul 2002 01:28:11 -0000
***************
*** 19,33 ****
  // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  // USA.
  
! // NB: this test assumes that _M_buf_size == 40, and not the usual
! // buffer_size length of BUFSIZ (8192), so that overflow/underflow can be
! // simulated a bit more readily.
  
  #include <fstream>
  #include <testsuite_hooks.h>
  
  // { dg-do compile }
  
  // test05
  // libstdc++/1886
  // should be able to instantiate basic_filebuf for non-standard types.
--- 19,44 ----
  // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  // USA.
  
! // 27.8.1.1 - Template class basic_filebuf 
! // NB: This file is for testing basic_filebuf with NO OTHER INCLUDES.
  
  #include <fstream>
  #include <testsuite_hooks.h>
  
  // { dg-do compile }
  
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::filebuf test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
  // test05
  // libstdc++/1886
  // should be able to instantiate basic_filebuf for non-standard types.
*************** template class std::basic_filebuf<short,
*** 35,40 ****
--- 46,52 ----
  
  int main() 
  {
+   test01();
    return 0;
  }
  
Index: testsuite/27_io/fstream.cc
===================================================================
RCS file: testsuite/27_io/fstream.cc
diff -N testsuite/27_io/fstream.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/fstream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 0 ****
--- 1,60 ----
+ // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
+ 
+ // Copyright (C) 2002 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.8.1.11 - Template class basic_fstream
+ // NB: This file is for testing basic_fstream with NO OTHER INCLUDES.
+ 
+ #include <fstream>
+ 
+ // { dg-do compile }
+ 
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::fstream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
+ namespace test 
+ {
+   using namespace std;
+   typedef short type_t;
+   template class basic_fstream<type_t, char_traits<type_t> >;
+ } // test
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/ifstream.cc
===================================================================
RCS file: testsuite/27_io/ifstream.cc
diff -N testsuite/27_io/ifstream.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/ifstream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 0 ****
--- 1,60 ----
+ // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
+ 
+ // Copyright (C) 2002 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.8.1.5 - Template class basic_ifstream
+ // NB: This file is for testing basic_ifstream with NO OTHER INCLUDES.
+ 
+ #include <fstream>
+ 
+ // { dg-do compile }
+ 
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::ifstream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
+ namespace test 
+ {
+   using namespace std;
+   typedef short type_t;
+   template class basic_ifstream<type_t, char_traits<type_t> >;
+ } // test
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/ios.cc
===================================================================
RCS file: testsuite/27_io/ios.cc
diff -N testsuite/27_io/ios.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/ios.cc	26 Jul 2002 01:28:11 -0000
***************
*** 0 ****
--- 1,60 ----
+ // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
+ 
+ // Copyright (C) 2002 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.4.4 - Template class basic_ios
+ // NB: This file is for testing basic_ios with NO OTHER INCLUDES.
+ 
+ #include <ios>
+ 
+ // { dg-do compile }
+ 
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::ios test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
+ namespace test 
+ {
+   using namespace std;
+   typedef short type_t;
+   template class basic_ios<type_t, char_traits<type_t> >;
+ } // test
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/iostream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/iostream.cc,v
retrieving revision 1.1
diff -c -p -r1.1 iostream.cc
*** testsuite/27_io/iostream.cc	26 Jan 2002 01:55:09 -0000	1.1
--- testsuite/27_io/iostream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 34,39 ****
--- 34,51 ----
  
  #include <istream>
  
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::iostream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
  namespace test 
  {
    using namespace std;
*************** namespace test 
*** 43,47 ****
--- 55,60 ----
  
  int main() 
  {
+   test01();
    return 0;
  }
Index: testsuite/27_io/istream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/istream.cc,v
retrieving revision 1.4
diff -c -p -r1.4 istream.cc
*** testsuite/27_io/istream.cc	26 Jan 2002 01:55:09 -0000	1.4
--- testsuite/27_io/istream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 34,39 ****
--- 34,51 ----
  
  // { dg-do compile }
  
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::istream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
  namespace test 
  {
    using namespace std;
*************** namespace test 
*** 43,47 ****
--- 55,60 ----
  
  int main() 
  {
+   test01();
    return 0;
  }
Index: testsuite/27_io/istringstream.cc
===================================================================
RCS file: testsuite/27_io/istringstream.cc
diff -N testsuite/27_io/istringstream.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/istringstream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 0 ****
--- 1,60 ----
+ // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
+ 
+ // Copyright (C) 2002 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.7.2 - Template class basic_istringstream
+ // NB: This file is for testing basic_istringstream with NO OTHER INCLUDES.
+ 
+ #include <sstream>
+ 
+ // { dg-do compile }
+ 
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::istringstream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
+ namespace test 
+ {
+   using namespace std;
+   typedef short type_t;
+   template class basic_istringstream<type_t, char_traits<type_t> >;
+ } // test
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/ofstream.cc
===================================================================
RCS file: testsuite/27_io/ofstream.cc
diff -N testsuite/27_io/ofstream.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/ofstream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 0 ****
--- 1,60 ----
+ // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
+ 
+ // Copyright (C) 2002 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.8.1.8 - Template class basic_ofstream
+ // NB: This file is for testing basic_ofstream with NO OTHER INCLUDES.
+ 
+ #include <fstream>
+ 
+ // { dg-do compile }
+ 
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::ifstream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
+ namespace test 
+ {
+   using namespace std;
+   typedef short type_t;
+   template class basic_ifstream<type_t, char_traits<type_t> >;
+ } // test
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/ostream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/ostream.cc,v
retrieving revision 1.4
diff -c -p -r1.4 ostream.cc
*** testsuite/27_io/ostream.cc	26 Jan 2002 01:55:09 -0000	1.4
--- testsuite/27_io/ostream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 34,39 ****
--- 34,51 ----
  
  // { dg-do compile }
  
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::ostream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
  namespace test 
  {
    using namespace std;
*************** namespace test 
*** 43,47 ****
--- 55,60 ----
  
  int main() 
  {
+   test01();
    return 0;
  }
Index: testsuite/27_io/ostringstream.cc
===================================================================
RCS file: testsuite/27_io/ostringstream.cc
diff -N testsuite/27_io/ostringstream.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/ostringstream.cc	26 Jul 2002 01:28:11 -0000
***************
*** 0 ****
--- 1,60 ----
+ // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
+ 
+ // Copyright (C) 2002 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.7.3 - Class basic_ostringstream
+ // NB: This file is for testing basic_ostringstream with NO OTHER INCLUDES.
+ 
+ #include <sstream>
+ 
+ // { dg-do compile }
+ 
+ // libstdc++/7216
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::ostringstream test_type;
+   typedef test_type::char_type char_type;
+   typedef test_type::traits_type traits_type;
+   typedef test_type::int_type int_type;
+   typedef test_type::pos_type pos_type;
+   typedef test_type::off_type off_type;
+ }
+ 
+ namespace test 
+ {
+   using namespace std;
+   typedef short type_t;
+   template class basic_ostringstream<type_t, char_traits<type_t> >;
+ } // test
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/ostringstream_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/ostringstream_members.cc,v
retrieving revision 1.2
diff -c -p -r1.2 ostringstream_members.cc
*** testsuite/27_io/ostringstream_members.cc	7 Aug 2001 03:38:33 -0000	1.2
--- testsuite/27_io/ostringstream_members.cc	26 Jul 2002 01:28:11 -0000
***************
*** 1,6 ****
  // 2001-05-23 Benjamin Kosnik  <bkoz@redhat.com>
  
! // Copyright (C) 2001 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
--- 1,6 ----
  // 2001-05-23 Benjamin Kosnik  <bkoz@redhat.com>
  
! // Copyright (C) 2001, 2002 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
*************** void test02()
*** 97,105 ****
--- 97,157 ----
    // These semantics are a joke, a serious defect, and incredibly lame.
  }
  
+ // 03: sanity checks for strings, stringbufs
+ void
+ test03()
+ {
+   bool test = false;
+ 
+   // Empty string sanity check.
+   std::string str01;
+   std::string::iterator __i_start = str01.begin();
+   std::string::iterator __i_end = str01.end();
+   std::string::size_type len = str01.size();
+   test = __i_start == __i_end;
+   VERIFY( len == 0 );
+ 
+   // Full string sanity check.
+   std::string str02("these golden days, i spend waiting for you:\n"
+ 		    "Betty Carter on Verve with I'm Yours and You're Mine.");
+   __i_start = str02.begin();
+   __i_end = str02.end();
+   len = str02.size();
+   VERIFY( __i_start != __i_end );
+   VERIFY( len != 0 );
+  
+   // Test an empty ostringstream for sanity.
+   std::ostringstream ostrstream0;
+   std::string str03 = ostrstream0.str();
+   __i_start = str03.begin();
+   __i_end = str03.end();
+   len = str03.size();
+   VERIFY( __i_start == __i_end );
+   VERIFY( len == 0 );
+   VERIFY( str01 == str03 );
+ }
+ 
+ // user-reported error
+ class derived_oss: public std::ostringstream 
+ {
+ public:
+   derived_oss() : std::ostringstream() { }
+ };
+ 
+ void
+ test03()
+ {
+   bool test = true;
+   derived_oss yy;
+   yy << "buena vista social club\n";
+   VERIFY( yy.str() == std::string("buena vista social club\n") );
+ }
+ 
  int main()
  {
    test01();
    test02();
+   test03();
+   test04();
    return 0;
  }
Index: testsuite/27_io/streambuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/streambuf.cc,v
retrieving revision 1.11
diff -c -p -r1.11 streambuf.cc
*** testsuite/27_io/streambuf.cc	28 Mar 2002 03:15:08 -0000	1.11
--- testsuite/27_io/streambuf.cc	26 Jul 2002 01:28:11 -0000
***************
*** 1,6 ****
! // 1999-10-11 bkoz
  
! // Copyright (C) 1999, 2000, 2001, 2002 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
--- 1,6 ----
! // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
  
! // Copyright (C) 2002 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
***************
*** 27,378 ****
  // 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 <cstring> // for memset, memcmp
  #include <streambuf>
- #include <string>
- #include <ostream>
- #include <testsuite_hooks.h>
  
! class testbuf : public std::streambuf
! {
! public:
! 
!   // Typedefs:
!   typedef std::streambuf::traits_type traits_type;
!   typedef std::streambuf::char_type char_type;
! 
!   testbuf(): std::streambuf() 
!   { _M_mode = (std::ios_base::in | std::ios_base::out); }
! 
!   bool
!   check_pointers()
!   { 
!     bool test = 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(char* beg, char* cur, char *end) 
!   { this->setg(beg, cur, end); }
! 
!   void 
!   pub_setp(char* beg, char* 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 = true;
!   char* lit01 = "chicago underground trio/possible cube on delmark";
!   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.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() );
! 
!   // pbackfail
!   buf01.pub_setg(lit01, lit01, (lit01 + i01));
!   VERIFY( i01 == buf01.in_avail() );
!   int_type intt01 = traits_type::to_int_type('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]) );
! 
!   // sputn/xsputn
!   char* lit02 = "isotope 217: the unstable molecule on thrill jockey";
!   int i02 = std::strlen(lit02);
!   char carray[i02 + 1];
!   std::memset(carray, 0, i02 + 1);
! 
!   buf01.pub_setp(carray, (carray + i02));
!   buf01.sputn(lit02, 0);
!   VERIFY( carray[0] == 0 );
!   VERIFY( lit02[0] == 'i' );
!   buf01.sputn(lit02, 1);
!   VERIFY( lit02[0] == carray[0] );
!   VERIFY( lit02[1] == '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 );
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
! }
! 
! void test02()
! {
!   typedef testbuf::traits_type traits_type;
!   typedef testbuf::int_type int_type;
! 
!   bool test = true;
!   char* lit01 = "chicago underground trio/possible cube on delmark";
!   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
!   size_t i01 = traits_type::length(lit01);
!   char carray01[i01];
!   std::memset(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] == 'c' );
!   buf01.sgetn(carray01 + 1, i01 - 1);
!   VERIFY( carray01[0] == 'c' );
!   VERIFY( carray01[1] == 'h' );
!   VERIFY( carray01[i01 - 1] == 'k' );
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
! }
!  
! // 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<char> nullbuf;
! typedef basic_nullbuf<wchar_t> wnullbuf;
! 
! template<typename T>
!   char
!   print(const T& x) 
!   {
!    nullbuf ob;
!    std::ostream out(&ob); 
!    out << x << std::endl;
!    return (!out ? '0' : '1');
!  }
! 
! void test03() 
! {
!   bool test = true;
!   const std::string control01("11111");
!   std::string test01;
! 
!   test01 += print(true);
!   test01 += print(3.14159);
!   test01 += print(10);
!   test01 += print('x');
!   test01 += print("pipo");
! 
!   VERIFY( test01 == control01 );
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
! }
! 
! class setpbuf : public std::streambuf
! {
!   char 		buffer[4];
!   std::string 	result;
! 
! public:
! 
!   std::string&
!   get_result()
!   { return result; }
! 
!   setpbuf()
!   {
!     char 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 = true;
!   std::string text = "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::string::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 );
! }
! 
! class nullsetpbuf : public std::streambuf
! {
!   char foo[64];
! public:
!   nullsetpbuf()
!   {
!     setp(foo, foo + 64);
!     setp(NULL, NULL);
!   }
! };
! 
! // libstdc++/1057
! void test05()
! {
!     std::string text1 = "abcdefghijklmn";
! 
!     nullsetpbuf nsp;
!     // Immediate crash as xsputn writes to null pointer
!     nsp.sputn(text1.c_str(), text1.length());
!     // ditto
!     nsp.sputc('a');
! }
! 
! // test06
! namespace gnu 
! {
!   class something_derived;
  }
  
! class gnu::something_derived : std::streambuf { };
! 
! // libstdc++/3599
! class testbuf2 : public std::streambuf
! {
! public:
!   typedef std::streambuf::traits_type traits_type;
! 
!   testbuf2() : std::streambuf() { }
!  
! protected:
!   int_type 
!   overflow(int_type c = traits_type::eof()) 
!   { return traits_type::not_eof(0); }
! };
! 
! void
! test07()
! {
!   bool test = true;
!   testbuf2 ob;
!   std::ostream out(&ob); 
! 
!   out << "gasp";
!   VERIFY(out.good());
! 
!   out << std::endl;
!   VERIFY(out.good());
! }
  
  int main() 
  {
    test01();
-   test02();
-   test03();
- 
-   test04();
-   test05();
- 
-   test07();
    return 0;
  }
--- 27,60 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
! // 27.5.2 - Template class basic_streambuf
! // NB: This file is for testing basic_streambuf with NO OTHER INCLUDES.
  
  #include <streambuf>
  
! // { dg-do compile }
  
+ // libstdc++/7216
  void test01()
  {
!   // Check for required typedefs
!   typedef std::streambuf test_type;
!   typedef test_type::char_type char_type;
!   typedef test_type::traits_type traits_type;
!   typedef test_type::int_type int_type;
!   typedef test_type::pos_type pos_type;
!   typedef test_type::off_type off_type;
  }
  
! namespace test 
! {
!   using namespace std;
!   typedef short type_t;
!   template class basic_streambuf<type_t, char_traits<type_t> >;
! } // test
  
  int main() 
  {
    test01();
    return 0;
  }
Index: testsuite/27_io/streambuf_members.cc
===================================================================
RCS file: testsuite/27_io/streambuf_members.cc
diff -N testsuite/27_io/streambuf_members.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/streambuf_members.cc	26 Jul 2002 01:28:12 -0000
***************
*** 0 ****
--- 1,378 ----
+ // 1999-10-11 bkoz
+ 
+ // Copyright (C) 1999, 2000, 2001, 2002 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 <cstring> // for memset, memcmp
+ #include <streambuf>
+ #include <string>
+ #include <ostream>
+ #include <testsuite_hooks.h>
+ 
+ class testbuf : public std::streambuf
+ {
+ public:
+ 
+   // Typedefs:
+   typedef std::streambuf::traits_type traits_type;
+   typedef std::streambuf::char_type char_type;
+ 
+   testbuf(): std::streambuf() 
+   { _M_mode = (std::ios_base::in | std::ios_base::out); }
+ 
+   bool
+   check_pointers()
+   { 
+     bool test = 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(char* beg, char* cur, char *end) 
+   { this->setg(beg, cur, end); }
+ 
+   void 
+   pub_setp(char* beg, char* 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 = true;
+   char* lit01 = "chicago underground trio/possible cube on delmark";
+   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.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() );
+ 
+   // pbackfail
+   buf01.pub_setg(lit01, lit01, (lit01 + i01));
+   VERIFY( i01 == buf01.in_avail() );
+   int_type intt01 = traits_type::to_int_type('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]) );
+ 
+   // sputn/xsputn
+   char* lit02 = "isotope 217: the unstable molecule on thrill jockey";
+   int i02 = std::strlen(lit02);
+   char carray[i02 + 1];
+   std::memset(carray, 0, i02 + 1);
+ 
+   buf01.pub_setp(carray, (carray + i02));
+   buf01.sputn(lit02, 0);
+   VERIFY( carray[0] == 0 );
+   VERIFY( lit02[0] == 'i' );
+   buf01.sputn(lit02, 1);
+   VERIFY( lit02[0] == carray[0] );
+   VERIFY( lit02[1] == '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 );
+ 
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+ }
+ 
+ void test02()
+ {
+   typedef testbuf::traits_type traits_type;
+   typedef testbuf::int_type int_type;
+ 
+   bool test = true;
+   char* lit01 = "chicago underground trio/possible cube on delmark";
+   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
+   size_t i01 = traits_type::length(lit01);
+   char carray01[i01];
+   std::memset(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] == 'c' );
+   buf01.sgetn(carray01 + 1, i01 - 1);
+   VERIFY( carray01[0] == 'c' );
+   VERIFY( carray01[1] == 'h' );
+   VERIFY( carray01[i01 - 1] == 'k' );
+ 
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+ }
+  
+ // 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<char> nullbuf;
+ typedef basic_nullbuf<wchar_t> wnullbuf;
+ 
+ template<typename T>
+   char
+   print(const T& x) 
+   {
+    nullbuf ob;
+    std::ostream out(&ob); 
+    out << x << std::endl;
+    return (!out ? '0' : '1');
+  }
+ 
+ void test03() 
+ {
+   bool test = true;
+   const std::string control01("11111");
+   std::string test01;
+ 
+   test01 += print(true);
+   test01 += print(3.14159);
+   test01 += print(10);
+   test01 += print('x');
+   test01 += print("pipo");
+ 
+   VERIFY( test01 == control01 );
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+ }
+ 
+ class setpbuf : public std::streambuf
+ {
+   char 		buffer[4];
+   std::string 	result;
+ 
+ public:
+ 
+   std::string&
+   get_result()
+   { return result; }
+ 
+   setpbuf()
+   {
+     char 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 = true;
+   std::string text = "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::string::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 );
+ }
+ 
+ class nullsetpbuf : public std::streambuf
+ {
+   char foo[64];
+ public:
+   nullsetpbuf()
+   {
+     setp(foo, foo + 64);
+     setp(NULL, NULL);
+   }
+ };
+ 
+ // libstdc++/1057
+ void test05()
+ {
+     std::string text1 = "abcdefghijklmn";
+ 
+     nullsetpbuf nsp;
+     // Immediate crash as xsputn writes to null pointer
+     nsp.sputn(text1.c_str(), text1.length());
+     // ditto
+     nsp.sputc('a');
+ }
+ 
+ // test06
+ namespace gnu 
+ {
+   class something_derived;
+ }
+ 
+ class gnu::something_derived : std::streambuf { };
+ 
+ // libstdc++/3599
+ class testbuf2 : public std::streambuf
+ {
+ public:
+   typedef std::streambuf::traits_type traits_type;
+ 
+   testbuf2() : std::streambuf() { }
+  
+ protected:
+   int_type 
+   overflow(int_type c = traits_type::eof()) 
+   { return traits_type::not_eof(0); }
+ };
+ 
+ void
+ test07()
+ {
+   bool test = true;
+   testbuf2 ob;
+   std::ostream out(&ob); 
+ 
+   out << "gasp";
+   VERIFY(out.good());
+ 
+   out << std::endl;
+   VERIFY(out.good());
+ }
+ 
+ int main() 
+ {
+   test01();
+   test02();
+   test03();
+ 
+   test04();
+   test05();
+ 
+   test07();
+   return 0;
+ }
Index: testsuite/27_io/stringbuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/stringbuf.cc,v
retrieving revision 1.8
diff -c -p -r1.8 stringbuf.cc
*** testsuite/27_io/stringbuf.cc	3 Mar 2002 17:48:42 -0000	1.8
--- testsuite/27_io/stringbuf.cc	26 Jul 2002 01:28:12 -0000
***************
*** 1,7 ****
! // 981208 bkoz test functionality of basic_stringbuf for char_type == char
  
! // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
! // 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
--- 1,6 ----
! // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
  
! // Copyright (C) 2002 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
***************
*** 19,490 ****
  // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  // USA.
  
! #include <sstream>
! #include <testsuite_hooks.h>
! 
! std::string str_01("mykonos. . . or what?");
! std::string str_02("paris, or sainte-maxime?");
! std::string str_03;
! std::stringbuf strb_01(str_01);
! std::stringbuf strb_02(str_02, std::ios_base::in);
! std::stringbuf strb_03(str_03, std::ios_base::out);
! 
! 
! // test the underlying allocator
! bool test01() {
!   bool test = false;
!   std::allocator<char> alloc_01;
!   std::allocator<char>::size_type size_01 = alloc_01.max_size();
!   std::allocator<char>::pointer p_01 = alloc_01.allocate(32);
! 
!   return true;
! }
! 
! 
! // test the streambuf/stringbuf locale settings
! bool test02() {
!   std::locale loc_tmp;
!   loc_tmp = strb_01.getloc();
!   strb_01.pubimbue(loc_tmp); //This should initialize _M_init to true
!   strb_01.getloc(); //This should just return _M_locale
! 
!   return true;
! }
! 
! 
! // test member functions
! bool test03() {
!   bool test = true;
! 
!   //stringbuf::str()
!   VERIFY( strb_01.str() == str_01 );
!   VERIFY( strb_02.str() == str_02 );
!   VERIFY( strb_03.str() == str_03 );
!  
!   //stringbuf::str(string&)
!   strb_03.str("none of the above, go to the oberoi in cairo, egypt.");
!   strb_03.str(str_01);
!   std::streamsize d1 = strb_01.in_avail();
!   std::streamsize d2 = strb_03.in_avail();
!   VERIFY( d1 ); // non-zero
!   VERIFY( !d2 ); // zero, cuz ios_base::out
!   VERIFY( d1 != d2 ); //these should be the same
!   VERIFY( str_01.length() == d1 );  
!   VERIFY( strb_01.str() == strb_03.str() ); //ditto
! 
!   // stringbuf::str(string&) and stringbuf::stringbuf(string&), where the
!   // string in question contains embedded NUL characters.  Note that in this
!   // embedded-NUL situation, the size must be passed to the string ctor.
!   std::string str_nulls ("eschew \0 obfuscation", 20);  // tested in 21_strings
!   std::stringbuf strb_normal (str_01);
!   std::stringbuf strb_nulls (str_nulls);
!   strb_normal.str(str_nulls);  // tried using 'strb_01' rather than declaring
!                                // another variable, but then test04 broke!
!   VERIFY( strb_nulls.in_avail() == str_nulls.size()  );
!   VERIFY( strb_nulls.str().size() == 20              );
!   VERIFY( strb_normal.in_avail() == str_nulls.size() );
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
!  
!   return test;
! }
! 
! 
! // test overloaded virtual functions
! bool test04() {
!   bool 			test = true;
!   std::string 		str_tmp;
!   std::stringbuf 		strb_tmp;
!   std::streamsize 		strmsz_1, strmsz_2;
!   std::streamoff  		strmof_1(-1), strmof_2;
!   typedef std::stringbuf::int_type int_type;
!   typedef std::stringbuf::traits_type traits_type;
!   typedef std::stringbuf::pos_type pos_type;
!   typedef std::stringbuf::off_type off_type;
! 
!   // GET
!   // int in_avail()
!   strmof_1 = strb_01.in_avail();
!   strmof_2 = strb_02.in_avail();
!   VERIFY( strmof_1 != strmof_2 );
!   VERIFY( strmof_1 == str_01.length() );
!   VERIFY( strmof_2 == str_02.length() );
!   strmof_1 = strb_03.in_avail(); 
!   VERIFY( strmof_1 == 0 ); // zero cuz write-only, or eof()? zero, from showmany
! 
!   // int_type sbumpc()
!   // if read_cur not avail, return uflow(), else return *read_cur & increment
!   int_type c1 = strb_01.sbumpc();
!   int_type c2 = strb_02.sbumpc();
!   VERIFY( c1 != c2 );
!   VERIFY( c1 == str_01[0] );
!   VERIFY( c2 == str_02[0] ); //should equal first letter at this point
!   int_type c3 = strb_01.sbumpc();
!   int_type c4 = strb_02.sbumpc();
!   VERIFY( c1 != c2 );
!   VERIFY( c1 != c3 );
!   VERIFY( c2 != c4 );
!   int_type c5 = strb_03.sbumpc();
!   VERIFY( c5 == traits_type::eof() );
! 
!   // int_type sgetc()
!   // if read_cur not avail, return uflow(), else return *read_cur  
!   int_type c6 = strb_01.sgetc();
!   int_type c7 = strb_02.sgetc();
!   VERIFY( c6 != c3 );
!   VERIFY( c7 != c4 );
!   int_type c8 = strb_01.sgetc();
!   int_type c9 = strb_02.sgetc();
!   VERIFY( c6 == c8 );
!   VERIFY( c7 == c9 );
!   c5 = strb_03.sgetc();
!   VERIFY( c5 == traits_type::eof() );
! 
!   // int_type snextc()
!   // calls sbumpc and if sbumpc != eof, return sgetc
!   c6 = strb_01.snextc();
!   c7 = strb_02.snextc();
!   VERIFY( c6 != c8 );
!   VERIFY( c7 != c9 );
!   VERIFY( c6 == str_01[3] );
!   VERIFY( c7 == str_02[3] ); //should equal fourth letter at this point
!   c5 = strb_03.snextc();
!   VERIFY( c5 == traits_type::eof() );
! 
!   // int showmanyc
!   // streamsize sgetn(char_type *s, streamsize n)
!   // streamsize xsgetn(char_type *s, streamsize n)
!   // assign up to n chars to s from input sequence, indexing in_cur as
!   // approp and returning the number of chars assigned
!   strmsz_1 = strb_01.in_avail();
!   strmsz_2 = strb_02.in_avail();
!   test = strmsz_1 != strmsz_2;
!   VERIFY( strmsz_1 != str_01.length() );
!   VERIFY( strmsz_2 != str_02.length() ); //because now we've moved into string
!   char carray1[11] = "";
!   strmsz_1 = strb_01.sgetn(carray1, 10);
!   char carray2[20] = "";
!   strmsz_2 = strb_02.sgetn(carray2, 10);
!   VERIFY( strmsz_1 == strmsz_2 );
!   VERIFY( strmsz_1 == 10 );
!   c1 = strb_01.sgetc();
!   c2 = strb_02.sgetc();
!   VERIFY( c6 == c1 ); //just by co-incidence both o's
!   VERIFY( c7 != c2 ); // n != i
!   VERIFY( c1 == str_01[13] );
!   VERIFY( c2 == str_02[13] ); //should equal fourteenth letter at this point
!   strmsz_1 = strb_03.sgetn(carray1, 10);
!   VERIFY( !strmsz_1 ); //zero
!   strmsz_1 = strb_02.in_avail();
!   strmsz_2 = strb_02.sgetn(carray2, strmsz_1 + 5);
!   VERIFY( strmsz_1 == strmsz_2 ); //write off the end
!   c4 = strb_02.sgetc(); // should be EOF
!   VERIFY( c4 == traits_type::eof() );
! 
!   // PUT
!   // int_type sputc(char_type c)
!   // if out_cur not avail, return overflow. Else, stores c at out_cur,
!   // increments out_cur, and returns c as int_type
!   strb_03.str(str_01); //reset
!   std::string::size_type sz1 = strb_03.str().length();
!   c1 = strb_03.sputc('a'); 
!   std::string::size_type sz2 = strb_03.str().length();
!   VERIFY( sz1 == sz2 ); //cuz inserting at out_cur, which is at beg to start
!   c2 = strb_03.sputc('b'); 
!   VERIFY( c1 != c2 );
!   VERIFY( strb_03.str() != str_01 );
!   c3 = strb_02.sputc('a'); // should be EOF because this is read-only
!   VERIFY( c3 == traits_type::eof() );
!   
!   // streamsize sputn(const char_typs* s, streamsize n)
!   // write up to n chars to out_cur from s, returning number assigned
!   // NB *sputn will happily put '\0' into your stream if you give it a chance*
!   str_tmp = strb_03.str();
!   sz1 = str_tmp.length();
!   strmsz_1 = strb_03.sputn("racadabras", 10);//"abracadabras or what?"
!   sz2 = strb_03.str().length();
!   VERIFY( sz1 == sz2 ); //shouldn't have changed length
!   VERIFY( strmsz_1 == 10 );
!   VERIFY( str_tmp != strb_03.str() );
!   strmsz_2 = strb_03.sputn(", i wanna reach out and", 10);
!   VERIFY( strmsz_1 == strmsz_2 ); // should re-allocate, copy 10 chars.
!   VERIFY( strmsz_1 == 10 );
!   VERIFY( strmsz_2 == 10 );
!   sz2 = strb_03.str().length();
!   VERIFY( sz1 != sz2 ); // need to change length
!   VERIFY( str_tmp != strb_03.str() );
!   str_tmp = strb_02.str();
!   strmsz_1 = strb_02.sputn("racadabra", 10);
!   VERIFY( strmsz_1 == 0 );  
!   VERIFY( str_tmp == strb_02.str() );
! 
!   // PUTBACK
!   // int_type pbfail(int_type c)
!   // called when gptr() null, gptr() == eback(), or traits::eq(*gptr, c) false
!   // "pending sequence" is:
!   //	1) everything as defined in underflow
!   // 	2) + if (traits::eq_int_type(c, traits::eof()), then input
!   // 	sequence is backed up one char before the pending sequence is
!   // 	determined.
!   //	3) + if (not 2) then c is prepended. Left unspecified is
!   //	whether the input sequence is backedup or modified in any way
!   // returns traits::eof() for failure, unspecified other value for success
  
!   // int_type sputbackc(char_type c)
!   // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
!   // otherwise decrements in_cur and returns *gptr()
!   strmsz_1 = strb_01.in_avail();
!   str_tmp = strb_01.str();
!   c1 = strb_01.sgetc(); //"mykonos. . . 'o'r what?"
!   c2 = strb_01.sputbackc('z');//"mykonos. . .zor what?"
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( c3 == c2 );
!   VERIFY( strb_01.str() == std::string("mykonos. . .zor what?") );
!   VERIFY( str_tmp.size() == strb_01.str().size() );
!   //test for _in_cur == _in_beg
!   strb_01.str(str_tmp);
!   strmsz_1 = strb_01.in_avail();
!   c1 = strb_01.sgetc(); //"'m'ykonos. . . or what?"
!   c2 = strb_01.sputbackc('z');//"mykonos. . . or what?"
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( c3 != c2 );
!   VERIFY( c1 == c3 );
!   VERIFY( c2 == traits_type::eof() );
!   VERIFY( strb_01.str() == str_tmp );
!   VERIFY( str_tmp.size() == strb_01.str().size() );
!   // test for replacing char with identical one
!   strb_01.str(str_01); //reset
!   strmsz_1 = strb_01.in_avail();
!   strb_01.sbumpc();
!   strb_01.sbumpc();
!   c1 = strb_01.sgetc(); //"my'k'onos. . . or what?"
!   c2 = strb_01.sputbackc('y');//"mykonos. . . or what?"
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( c3 == c2 );
!   VERIFY( c1 != c3 );
!   VERIFY( strb_01.str() == str_01 );
!   VERIFY( str_01.size() == strb_01.str().size() );
!   //test for ios_base::out
!   strmsz_2 = strb_03.in_avail();
!   c4 = strb_03.sputbackc('x');
!   VERIFY( c4 == traits_type::eof() );
  
!   // int_type sungetc()
!   // if in_cur not avail, return pbackfail(), else decrement and
!   // return to_int_type(*gptr())
!   for (int i = 0; i<12; ++i)
!     strb_01.sbumpc();
!   strmsz_1 = strb_01.in_avail();
!   str_tmp = strb_01.str();
!   c1 = strb_01.sgetc(); //"mykonos. . . 'o'r what?"
!   c2 = strb_01.sungetc();//"mykonos. . . or what?"
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( c3 == c2 );
!   VERIFY( c1 != c3 );
!   VERIFY( c2 == ' ' );
!   VERIFY( strb_01.str() == str_01 );
!   VERIFY( str_01.size() == strb_01.str().size() );
!   //test for _in_cur == _in_beg
!   strb_01.str(str_tmp);
!   strmsz_1 = strb_01.in_avail();
!   c1 = strb_01.sgetc(); //"'m'ykonos. . . or what?"
!   c2 = strb_01.sungetc();//"mykonos. . . or what?"
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( c3 != c2 );
!   VERIFY( c1 == c3 );
!   VERIFY( c2 == traits_type::eof() );
!   VERIFY( strb_01.str() == str_01 );
!   VERIFY( str_01.size() == strb_01.str().size() );
!   // test for replacing char with identical one
!   strb_01.str(str_01); //reset
!   strmsz_1 = strb_01.in_avail();
!   strb_01.sbumpc();
!   strb_01.sbumpc();
!   c1 = strb_01.sgetc(); //"my'k'onos. . . or what?"
!   c2 = strb_01.sungetc();//"mykonos. . . or what?"
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( c3 == c2 );
!   VERIFY( c1 != c3 );
!   VERIFY( strb_01.str() == str_01 );
!   VERIFY( str_01.size() == strb_01.str().size() );
!   //test for ios_base::out
!   strmsz_2 = strb_03.in_avail();
!   c4 = strb_03.sungetc();
!   VERIFY( c4 == traits_type::eof() );
! 
!   // BUFFER MANAGEMENT & POSITIONING
!   // sync
!   // pubsync
!   strb_01.pubsync();
!   strb_02.pubsync();
!   strb_03.pubsync();
! 
!   // setbuf
!   // pubsetbuf(char_type* s, streamsize n)
!   str_tmp = std::string("naaaah, go to cebu");
!   strb_01.pubsetbuf(const_cast<char*> (str_tmp.c_str()), str_tmp.size());
!   VERIFY( strb_01.str() == str_tmp );
!   strb_01.pubsetbuf(0,0);
!   VERIFY( strb_01.str() == str_tmp );
! 
!   // seekoff
!   // pubseekoff(off_type off, ios_base::seekdir way, ios_base::openmode which)
!   // alters the stream position to off
!   pos_type pt_1(off_type(-1));
!   pos_type pt_2(off_type(0));
!   off_type off_1 = 0;
!   off_type off_2 = 0;
!   strb_01.str(str_01); //in|out ("mykonos. . . or what?");
!   strb_02.str(str_02); //in ("paris, or sainte-maxime?");
!   strb_03.str(str_03); //out ("")
!   //IN|OUT
!   //beg
!   pt_1 = strb_01.pubseekoff(2, std::ios_base::beg);
!   off_1 = pt_1;
!   VERIFY( off_1 >= 0 );
!   c1 = strb_01.snextc(); //current in pointer +1
!   VERIFY( c1 == 'o' );
!   c2 = strb_01.sputc('x');  //test current out pointer
!   str_tmp = std::string("myxonos. . . or what?");
!   VERIFY( strb_01.str() == str_tmp );
!   //cur
!   pt_1 = strb_01.pubseekoff(2, std::ios_base::cur);
!   off_1 = pt_1;
!   VERIFY( off_1 == -1 ); // can't seekoff for in and out + cur in sstreams
!   pt_1 = strb_01.pubseekoff(2, std::ios_base::cur, std::ios_base::in);
!   off_1 = pt_1;
!   pt_2 = strb_01.pubseekoff(2, std::ios_base::cur, std::ios_base::in);
!   off_2 = pt_2;
!   VERIFY( off_2 == off_1 + 2 );
!   c1 = strb_01.snextc(); //current in pointer + 1
!   VERIFY( c1 == ' ' );
!   c2 = strb_01.sputc('x');  //test current out pointer
!   str_tmp = std::string("myxxnos. . . or what?");
!   VERIFY( strb_01.str() == str_tmp );
!   //end
!   pt_2 = strb_01.pubseekoff(2, std::ios_base::end);
!   off_1 = pt_2;
!   VERIFY( off_1 == -1 ); // not a valid position
!   VERIFY( strb_01.str() == str_tmp );
!   // end part two (from the filebuf tests)
!   strb_01.pubseekoff(0, std::ios_base::end);
!   strmsz_1 = strb_01.in_avail(); // 0 cuz at the end
!   c1 = strb_01.sgetc(); 
!   c2 = strb_01.sungetc();
!   strmsz_2 = strb_01.in_avail(); // 1
!   c3 = strb_01.sgetc();
!   VERIFY( c1 != c2 );
!   VERIFY( strmsz_2 != strmsz_1 );
!   VERIFY( strmsz_2 == 1 );
!   // end part three
!   strmsz_1 = strb_01.str().size();
!   strmsz_2 = strb_01.sputn(" ravi shankar meets carlos santana in LoHa", 90);
!   strb_01.pubseekoff(0, std::ios_base::end);
!   strb_01.sputc('<');
!   str_tmp = strb_01.str();
!   VERIFY( str_tmp.size() == strmsz_1 + strmsz_2 + 1 );
!   // IN
!   // OUT
! 
!   // seekpos
!   // pubseekpos(pos_type sp, ios_base::openmode)
!   // alters the stream position to sp
!   strb_01.str(str_01); //in|out ("mykonos. . . or what?");
!   strb_02.str(str_02); //in ("paris, or sainte-maxime?");
!   strb_03.str(str_03); //out ("")
!   //IN|OUT
!   //beg
!   pt_1 = strb_01.pubseekoff(2, std::ios_base::beg);
!   off_1 = pt_1;
!   VERIFY( off_1 >= 0 );
!   pt_1 = strb_01.pubseekoff(0, std::ios_base::cur, std::ios_base::out);
!   off_1 = pt_1;
!   c1 = strb_01.snextc(); //current in pointer +1
!   VERIFY( c1 == 'o' );
!   c2 = strb_01.sputc('x');  //test current out pointer
!   str_tmp = std::string("myxonos. . . or what?");
!   VERIFY( strb_01.str() == str_tmp );
!   strb_01.pubsync(); //resets pointers
!   pt_2 = strb_01.pubseekpos(pt_1, std::ios_base::in|std::ios_base::out);
!   off_2 = pt_2;
!   VERIFY( off_1 == off_2 );
!   c3 = strb_01.snextc(); //current in pointer +1
!   VERIFY( c1 == c3 );
!   c2 = strb_01.sputc('x');  //test current out pointer
!   str_tmp = std::string("myxonos. . . or what?");
!   VERIFY( strb_01.str() == str_tmp );
! 
!   // VIRTUALS (indirectly tested)
!   // underflow
!   // if read position avail, returns *gptr()
! 
!   // pbackfail(int_type c)
!   // put c back into input sequence
! 
!   // overflow
!   // appends c to output seq
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
! 
!   return test;
! }
  
  
! // libstdc++/3955 -- ios_base::app overwrites from the beginning
! bool test05()
  {
!   bool test = true;
! 
!   std::ostringstream os ("foo");
!   os << "bar";
! 
!   test = os.str() == "bar";
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
! 
!   return test;
  }
  
! bool test06()
  {
!   bool test = true;
! 
!   std::ostringstream os ("foo", std::ios_base::app);
!   os << "bar";
! 
!   test = os.str() == "foobar";
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
  
!   return test;
! }
! 
! int main()
  {
    test01();
-   test02();
-   test03();
-   test04();
-   test05();
-   test06();
- 
    return 0;
  }
- 
- 
- 
- // more candy!!!
--- 18,60 ----
  // 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.7.1 - Template class basic_stringbuf
! // NB: This file is for testing basic_stringbuf with NO OTHER INCLUDES.
  
! #include <sstream>
  
+ // { dg-do compile }
  
! // libstdc++/7216
! void test01()
  {
!   // Check for required typedefs
!   typedef std::stringbuf test_type;
!   typedef test_type::char_type char_type;
!   typedef test_type::traits_type traits_type;
!   typedef test_type::int_type int_type;
!   typedef test_type::pos_type pos_type;
!   typedef test_type::off_type off_type;
  }
  
! namespace test 
  {
!   using namespace std;
!   typedef short type_t;
!   template class basic_stringbuf<type_t, char_traits<type_t> >;
! } // test
  
! int main() 
  {
    test01();
    return 0;
  }
Index: testsuite/27_io/stringbuf_members.cc
===================================================================
RCS file: testsuite/27_io/stringbuf_members.cc
diff -N testsuite/27_io/stringbuf_members.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/stringbuf_members.cc	26 Jul 2002 01:28:13 -0000
***************
*** 0 ****
--- 1,490 ----
+ // 981208 bkoz test functionality of basic_stringbuf for char_type == char
+ 
+ // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+ // 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 <sstream>
+ #include <testsuite_hooks.h>
+ 
+ std::string str_01("mykonos. . . or what?");
+ std::string str_02("paris, or sainte-maxime?");
+ std::string str_03;
+ std::stringbuf strb_01(str_01);
+ std::stringbuf strb_02(str_02, std::ios_base::in);
+ std::stringbuf strb_03(str_03, std::ios_base::out);
+ 
+ 
+ // test the underlying allocator
+ bool test01() {
+   bool test = false;
+   std::allocator<char> alloc_01;
+   std::allocator<char>::size_type size_01 = alloc_01.max_size();
+   std::allocator<char>::pointer p_01 = alloc_01.allocate(32);
+ 
+   return true;
+ }
+ 
+ 
+ // test the streambuf/stringbuf locale settings
+ bool test02() {
+   std::locale loc_tmp;
+   loc_tmp = strb_01.getloc();
+   strb_01.pubimbue(loc_tmp); //This should initialize _M_init to true
+   strb_01.getloc(); //This should just return _M_locale
+ 
+   return true;
+ }
+ 
+ 
+ // test member functions
+ bool test03() {
+   bool test = true;
+ 
+   //stringbuf::str()
+   VERIFY( strb_01.str() == str_01 );
+   VERIFY( strb_02.str() == str_02 );
+   VERIFY( strb_03.str() == str_03 );
+  
+   //stringbuf::str(string&)
+   strb_03.str("none of the above, go to the oberoi in cairo, egypt.");
+   strb_03.str(str_01);
+   std::streamsize d1 = strb_01.in_avail();
+   std::streamsize d2 = strb_03.in_avail();
+   VERIFY( d1 ); // non-zero
+   VERIFY( !d2 ); // zero, cuz ios_base::out
+   VERIFY( d1 != d2 ); //these should be the same
+   VERIFY( str_01.length() == d1 );  
+   VERIFY( strb_01.str() == strb_03.str() ); //ditto
+ 
+   // stringbuf::str(string&) and stringbuf::stringbuf(string&), where the
+   // string in question contains embedded NUL characters.  Note that in this
+   // embedded-NUL situation, the size must be passed to the string ctor.
+   std::string str_nulls ("eschew \0 obfuscation", 20);  // tested in 21_strings
+   std::stringbuf strb_normal (str_01);
+   std::stringbuf strb_nulls (str_nulls);
+   strb_normal.str(str_nulls);  // tried using 'strb_01' rather than declaring
+                                // another variable, but then test04 broke!
+   VERIFY( strb_nulls.in_avail() == str_nulls.size()  );
+   VERIFY( strb_nulls.str().size() == 20              );
+   VERIFY( strb_normal.in_avail() == str_nulls.size() );
+ 
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+  
+   return test;
+ }
+ 
+ 
+ // test overloaded virtual functions
+ bool test04() {
+   bool 			test = true;
+   std::string 		str_tmp;
+   std::stringbuf 		strb_tmp;
+   std::streamsize 		strmsz_1, strmsz_2;
+   std::streamoff  		strmof_1(-1), strmof_2;
+   typedef std::stringbuf::int_type int_type;
+   typedef std::stringbuf::traits_type traits_type;
+   typedef std::stringbuf::pos_type pos_type;
+   typedef std::stringbuf::off_type off_type;
+ 
+   // GET
+   // int in_avail()
+   strmof_1 = strb_01.in_avail();
+   strmof_2 = strb_02.in_avail();
+   VERIFY( strmof_1 != strmof_2 );
+   VERIFY( strmof_1 == str_01.length() );
+   VERIFY( strmof_2 == str_02.length() );
+   strmof_1 = strb_03.in_avail(); 
+   VERIFY( strmof_1 == 0 ); // zero cuz write-only, or eof()? zero, from showmany
+ 
+   // int_type sbumpc()
+   // if read_cur not avail, return uflow(), else return *read_cur & increment
+   int_type c1 = strb_01.sbumpc();
+   int_type c2 = strb_02.sbumpc();
+   VERIFY( c1 != c2 );
+   VERIFY( c1 == str_01[0] );
+   VERIFY( c2 == str_02[0] ); //should equal first letter at this point
+   int_type c3 = strb_01.sbumpc();
+   int_type c4 = strb_02.sbumpc();
+   VERIFY( c1 != c2 );
+   VERIFY( c1 != c3 );
+   VERIFY( c2 != c4 );
+   int_type c5 = strb_03.sbumpc();
+   VERIFY( c5 == traits_type::eof() );
+ 
+   // int_type sgetc()
+   // if read_cur not avail, return uflow(), else return *read_cur  
+   int_type c6 = strb_01.sgetc();
+   int_type c7 = strb_02.sgetc();
+   VERIFY( c6 != c3 );
+   VERIFY( c7 != c4 );
+   int_type c8 = strb_01.sgetc();
+   int_type c9 = strb_02.sgetc();
+   VERIFY( c6 == c8 );
+   VERIFY( c7 == c9 );
+   c5 = strb_03.sgetc();
+   VERIFY( c5 == traits_type::eof() );
+ 
+   // int_type snextc()
+   // calls sbumpc and if sbumpc != eof, return sgetc
+   c6 = strb_01.snextc();
+   c7 = strb_02.snextc();
+   VERIFY( c6 != c8 );
+   VERIFY( c7 != c9 );
+   VERIFY( c6 == str_01[3] );
+   VERIFY( c7 == str_02[3] ); //should equal fourth letter at this point
+   c5 = strb_03.snextc();
+   VERIFY( c5 == traits_type::eof() );
+ 
+   // int showmanyc
+   // streamsize sgetn(char_type *s, streamsize n)
+   // streamsize xsgetn(char_type *s, streamsize n)
+   // assign up to n chars to s from input sequence, indexing in_cur as
+   // approp and returning the number of chars assigned
+   strmsz_1 = strb_01.in_avail();
+   strmsz_2 = strb_02.in_avail();
+   test = strmsz_1 != strmsz_2;
+   VERIFY( strmsz_1 != str_01.length() );
+   VERIFY( strmsz_2 != str_02.length() ); //because now we've moved into string
+   char carray1[11] = "";
+   strmsz_1 = strb_01.sgetn(carray1, 10);
+   char carray2[20] = "";
+   strmsz_2 = strb_02.sgetn(carray2, 10);
+   VERIFY( strmsz_1 == strmsz_2 );
+   VERIFY( strmsz_1 == 10 );
+   c1 = strb_01.sgetc();
+   c2 = strb_02.sgetc();
+   VERIFY( c6 == c1 ); //just by co-incidence both o's
+   VERIFY( c7 != c2 ); // n != i
+   VERIFY( c1 == str_01[13] );
+   VERIFY( c2 == str_02[13] ); //should equal fourteenth letter at this point
+   strmsz_1 = strb_03.sgetn(carray1, 10);
+   VERIFY( !strmsz_1 ); //zero
+   strmsz_1 = strb_02.in_avail();
+   strmsz_2 = strb_02.sgetn(carray2, strmsz_1 + 5);
+   VERIFY( strmsz_1 == strmsz_2 ); //write off the end
+   c4 = strb_02.sgetc(); // should be EOF
+   VERIFY( c4 == traits_type::eof() );
+ 
+   // PUT
+   // int_type sputc(char_type c)
+   // if out_cur not avail, return overflow. Else, stores c at out_cur,
+   // increments out_cur, and returns c as int_type
+   strb_03.str(str_01); //reset
+   std::string::size_type sz1 = strb_03.str().length();
+   c1 = strb_03.sputc('a'); 
+   std::string::size_type sz2 = strb_03.str().length();
+   VERIFY( sz1 == sz2 ); //cuz inserting at out_cur, which is at beg to start
+   c2 = strb_03.sputc('b'); 
+   VERIFY( c1 != c2 );
+   VERIFY( strb_03.str() != str_01 );
+   c3 = strb_02.sputc('a'); // should be EOF because this is read-only
+   VERIFY( c3 == traits_type::eof() );
+   
+   // streamsize sputn(const char_typs* s, streamsize n)
+   // write up to n chars to out_cur from s, returning number assigned
+   // NB *sputn will happily put '\0' into your stream if you give it a chance*
+   str_tmp = strb_03.str();
+   sz1 = str_tmp.length();
+   strmsz_1 = strb_03.sputn("racadabras", 10);//"abracadabras or what?"
+   sz2 = strb_03.str().length();
+   VERIFY( sz1 == sz2 ); //shouldn't have changed length
+   VERIFY( strmsz_1 == 10 );
+   VERIFY( str_tmp != strb_03.str() );
+   strmsz_2 = strb_03.sputn(", i wanna reach out and", 10);
+   VERIFY( strmsz_1 == strmsz_2 ); // should re-allocate, copy 10 chars.
+   VERIFY( strmsz_1 == 10 );
+   VERIFY( strmsz_2 == 10 );
+   sz2 = strb_03.str().length();
+   VERIFY( sz1 != sz2 ); // need to change length
+   VERIFY( str_tmp != strb_03.str() );
+   str_tmp = strb_02.str();
+   strmsz_1 = strb_02.sputn("racadabra", 10);
+   VERIFY( strmsz_1 == 0 );  
+   VERIFY( str_tmp == strb_02.str() );
+ 
+   // PUTBACK
+   // int_type pbfail(int_type c)
+   // called when gptr() null, gptr() == eback(), or traits::eq(*gptr, c) false
+   // "pending sequence" is:
+   //	1) everything as defined in underflow
+   // 	2) + if (traits::eq_int_type(c, traits::eof()), then input
+   // 	sequence is backed up one char before the pending sequence is
+   // 	determined.
+   //	3) + if (not 2) then c is prepended. Left unspecified is
+   //	whether the input sequence is backedup or modified in any way
+   // returns traits::eof() for failure, unspecified other value for success
+ 
+   // int_type sputbackc(char_type c)
+   // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+   // otherwise decrements in_cur and returns *gptr()
+   strmsz_1 = strb_01.in_avail();
+   str_tmp = strb_01.str();
+   c1 = strb_01.sgetc(); //"mykonos. . . 'o'r what?"
+   c2 = strb_01.sputbackc('z');//"mykonos. . .zor what?"
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( c3 == c2 );
+   VERIFY( strb_01.str() == std::string("mykonos. . .zor what?") );
+   VERIFY( str_tmp.size() == strb_01.str().size() );
+   //test for _in_cur == _in_beg
+   strb_01.str(str_tmp);
+   strmsz_1 = strb_01.in_avail();
+   c1 = strb_01.sgetc(); //"'m'ykonos. . . or what?"
+   c2 = strb_01.sputbackc('z');//"mykonos. . . or what?"
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( c3 != c2 );
+   VERIFY( c1 == c3 );
+   VERIFY( c2 == traits_type::eof() );
+   VERIFY( strb_01.str() == str_tmp );
+   VERIFY( str_tmp.size() == strb_01.str().size() );
+   // test for replacing char with identical one
+   strb_01.str(str_01); //reset
+   strmsz_1 = strb_01.in_avail();
+   strb_01.sbumpc();
+   strb_01.sbumpc();
+   c1 = strb_01.sgetc(); //"my'k'onos. . . or what?"
+   c2 = strb_01.sputbackc('y');//"mykonos. . . or what?"
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( c3 == c2 );
+   VERIFY( c1 != c3 );
+   VERIFY( strb_01.str() == str_01 );
+   VERIFY( str_01.size() == strb_01.str().size() );
+   //test for ios_base::out
+   strmsz_2 = strb_03.in_avail();
+   c4 = strb_03.sputbackc('x');
+   VERIFY( c4 == traits_type::eof() );
+ 
+   // int_type sungetc()
+   // if in_cur not avail, return pbackfail(), else decrement and
+   // return to_int_type(*gptr())
+   for (int i = 0; i<12; ++i)
+     strb_01.sbumpc();
+   strmsz_1 = strb_01.in_avail();
+   str_tmp = strb_01.str();
+   c1 = strb_01.sgetc(); //"mykonos. . . 'o'r what?"
+   c2 = strb_01.sungetc();//"mykonos. . . or what?"
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( c3 == c2 );
+   VERIFY( c1 != c3 );
+   VERIFY( c2 == ' ' );
+   VERIFY( strb_01.str() == str_01 );
+   VERIFY( str_01.size() == strb_01.str().size() );
+   //test for _in_cur == _in_beg
+   strb_01.str(str_tmp);
+   strmsz_1 = strb_01.in_avail();
+   c1 = strb_01.sgetc(); //"'m'ykonos. . . or what?"
+   c2 = strb_01.sungetc();//"mykonos. . . or what?"
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( c3 != c2 );
+   VERIFY( c1 == c3 );
+   VERIFY( c2 == traits_type::eof() );
+   VERIFY( strb_01.str() == str_01 );
+   VERIFY( str_01.size() == strb_01.str().size() );
+   // test for replacing char with identical one
+   strb_01.str(str_01); //reset
+   strmsz_1 = strb_01.in_avail();
+   strb_01.sbumpc();
+   strb_01.sbumpc();
+   c1 = strb_01.sgetc(); //"my'k'onos. . . or what?"
+   c2 = strb_01.sungetc();//"mykonos. . . or what?"
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( c3 == c2 );
+   VERIFY( c1 != c3 );
+   VERIFY( strb_01.str() == str_01 );
+   VERIFY( str_01.size() == strb_01.str().size() );
+   //test for ios_base::out
+   strmsz_2 = strb_03.in_avail();
+   c4 = strb_03.sungetc();
+   VERIFY( c4 == traits_type::eof() );
+ 
+   // BUFFER MANAGEMENT & POSITIONING
+   // sync
+   // pubsync
+   strb_01.pubsync();
+   strb_02.pubsync();
+   strb_03.pubsync();
+ 
+   // setbuf
+   // pubsetbuf(char_type* s, streamsize n)
+   str_tmp = std::string("naaaah, go to cebu");
+   strb_01.pubsetbuf(const_cast<char*> (str_tmp.c_str()), str_tmp.size());
+   VERIFY( strb_01.str() == str_tmp );
+   strb_01.pubsetbuf(0,0);
+   VERIFY( strb_01.str() == str_tmp );
+ 
+   // seekoff
+   // pubseekoff(off_type off, ios_base::seekdir way, ios_base::openmode which)
+   // alters the stream position to off
+   pos_type pt_1(off_type(-1));
+   pos_type pt_2(off_type(0));
+   off_type off_1 = 0;
+   off_type off_2 = 0;
+   strb_01.str(str_01); //in|out ("mykonos. . . or what?");
+   strb_02.str(str_02); //in ("paris, or sainte-maxime?");
+   strb_03.str(str_03); //out ("")
+   //IN|OUT
+   //beg
+   pt_1 = strb_01.pubseekoff(2, std::ios_base::beg);
+   off_1 = pt_1;
+   VERIFY( off_1 >= 0 );
+   c1 = strb_01.snextc(); //current in pointer +1
+   VERIFY( c1 == 'o' );
+   c2 = strb_01.sputc('x');  //test current out pointer
+   str_tmp = std::string("myxonos. . . or what?");
+   VERIFY( strb_01.str() == str_tmp );
+   //cur
+   pt_1 = strb_01.pubseekoff(2, std::ios_base::cur);
+   off_1 = pt_1;
+   VERIFY( off_1 == -1 ); // can't seekoff for in and out + cur in sstreams
+   pt_1 = strb_01.pubseekoff(2, std::ios_base::cur, std::ios_base::in);
+   off_1 = pt_1;
+   pt_2 = strb_01.pubseekoff(2, std::ios_base::cur, std::ios_base::in);
+   off_2 = pt_2;
+   VERIFY( off_2 == off_1 + 2 );
+   c1 = strb_01.snextc(); //current in pointer + 1
+   VERIFY( c1 == ' ' );
+   c2 = strb_01.sputc('x');  //test current out pointer
+   str_tmp = std::string("myxxnos. . . or what?");
+   VERIFY( strb_01.str() == str_tmp );
+   //end
+   pt_2 = strb_01.pubseekoff(2, std::ios_base::end);
+   off_1 = pt_2;
+   VERIFY( off_1 == -1 ); // not a valid position
+   VERIFY( strb_01.str() == str_tmp );
+   // end part two (from the filebuf tests)
+   strb_01.pubseekoff(0, std::ios_base::end);
+   strmsz_1 = strb_01.in_avail(); // 0 cuz at the end
+   c1 = strb_01.sgetc(); 
+   c2 = strb_01.sungetc();
+   strmsz_2 = strb_01.in_avail(); // 1
+   c3 = strb_01.sgetc();
+   VERIFY( c1 != c2 );
+   VERIFY( strmsz_2 != strmsz_1 );
+   VERIFY( strmsz_2 == 1 );
+   // end part three
+   strmsz_1 = strb_01.str().size();
+   strmsz_2 = strb_01.sputn(" ravi shankar meets carlos santana in LoHa", 90);
+   strb_01.pubseekoff(0, std::ios_base::end);
+   strb_01.sputc('<');
+   str_tmp = strb_01.str();
+   VERIFY( str_tmp.size() == strmsz_1 + strmsz_2 + 1 );
+   // IN
+   // OUT
+ 
+   // seekpos
+   // pubseekpos(pos_type sp, ios_base::openmode)
+   // alters the stream position to sp
+   strb_01.str(str_01); //in|out ("mykonos. . . or what?");
+   strb_02.str(str_02); //in ("paris, or sainte-maxime?");
+   strb_03.str(str_03); //out ("")
+   //IN|OUT
+   //beg
+   pt_1 = strb_01.pubseekoff(2, std::ios_base::beg);
+   off_1 = pt_1;
+   VERIFY( off_1 >= 0 );
+   pt_1 = strb_01.pubseekoff(0, std::ios_base::cur, std::ios_base::out);
+   off_1 = pt_1;
+   c1 = strb_01.snextc(); //current in pointer +1
+   VERIFY( c1 == 'o' );
+   c2 = strb_01.sputc('x');  //test current out pointer
+   str_tmp = std::string("myxonos. . . or what?");
+   VERIFY( strb_01.str() == str_tmp );
+   strb_01.pubsync(); //resets pointers
+   pt_2 = strb_01.pubseekpos(pt_1, std::ios_base::in|std::ios_base::out);
+   off_2 = pt_2;
+   VERIFY( off_1 == off_2 );
+   c3 = strb_01.snextc(); //current in pointer +1
+   VERIFY( c1 == c3 );
+   c2 = strb_01.sputc('x');  //test current out pointer
+   str_tmp = std::string("myxonos. . . or what?");
+   VERIFY( strb_01.str() == str_tmp );
+ 
+   // VIRTUALS (indirectly tested)
+   // underflow
+   // if read position avail, returns *gptr()
+ 
+   // pbackfail(int_type c)
+   // put c back into input sequence
+ 
+   // overflow
+   // appends c to output seq
+ 
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+ 
+   return test;
+ }
+ 
+ 
+ // libstdc++/3955 -- ios_base::app overwrites from the beginning
+ bool test05()
+ {
+   bool test = true;
+ 
+   std::ostringstream os ("foo");
+   os << "bar";
+ 
+   test = os.str() == "bar";
+ 
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+ 
+   return test;
+ }
+ 
+ bool test06()
+ {
+   bool test = true;
+ 
+   std::ostringstream os ("foo", std::ios_base::app);
+   os << "bar";
+ 
+   test = os.str() == "foobar";
+ 
+ #ifdef DEBUG_ASSERT
+   assert(test);
+ #endif
+ 
+   return test;
+ }
+ 
+ int main()
+ {
+   test01();
+   test02();
+   test03();
+   test04();
+   test05();
+   test06();
+ 
+   return 0;
+ }
+ 
+ 
+ 
+ // more candy!!!
Index: testsuite/27_io/stringstream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/stringstream.cc,v
retrieving revision 1.8
diff -c -p -r1.8 stringstream.cc
*** testsuite/27_io/stringstream.cc	16 Jan 2002 19:57:39 -0000	1.8
--- testsuite/27_io/stringstream.cc	26 Jul 2002 01:28:13 -0000
***************
*** 1,7 ****
! // 981015 bkoz
! // i,o,stringstream usage
  
! // Copyright (C) 1997, 1998, 1999 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
--- 1,6 ----
! // 2002-07-25 Benjamin Kosnik <bkoz@redhat.com>
  
! // Copyright (C) 2002 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
***************
*** 28,160 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
! #include <vector>
! #include <string>
! #include <sstream>
! #include <testsuite_hooks.h>
! 
! // 01: sanity checks for strings, stringbufs
! std::string 
! test01()
! {
!   bool test = false;
  
!   // Empty string sanity check.
!   std::string str01;
!   std::string::iterator __i_start = str01.begin();
!   std::string::iterator __i_end = str01.end();
!   std::string::size_type len = str01.size();
!   test = __i_start == __i_end;
!   VERIFY( len == 0 );
! 
!   // Full string sanity check.
!   std::string str02("these golden days, i spend waiting for you:\n"
! 		    "Betty Carter on Verve with I'm Yours and You're Mine.");
!   __i_start = str02.begin();
!   __i_end = str02.end();
!   len = str02.size();
!   VERIFY( __i_start != __i_end );
!   VERIFY( len != 0 );
!  
!   // Test an empty ostring stream for sanity.
!   std::ostringstream ostrstream0;
!   std::string str03 = ostrstream0.str();
!   __i_start = str03.begin();
!   __i_end = str03.end();
!   len = str03.size();
!   VERIFY( __i_start == __i_end );
!   VERIFY( len == 0 );
!   VERIFY( str01 == str03 );
! 
!   return str02;
! }
  
  
! int
! test02()
  {
!   bool test = true;
! 
!   //
!   // 1: Automatic formatting of a compound string
!   //
!   int i = 1024;
!   int *pi = &i;
!   double d = 3.14159;
!   double *pd = &d;
!   std::string blank;
!   std::ostringstream ostrst01; 
!   std::ostringstream ostrst02(blank); 
!   
!   // No buffer,so should be created.
!   ostrst01 << "i: " << i << " i's address:  " << pi << "\n"
! 	     << "d: " << d << " d's address: " << pd << std::endl;
!   // Buffer, so existing buffer should be overwritten.
!   ostrst02 << "i: " << i << " i's address:  " << pi << "\n"
! 	     << "d: " << d << " d's address: " << pd << std::endl;
! 
!   std::string msg01 = ostrst01.str();
!   std::string msg02 = ostrst02.str();
!   VERIFY( msg01 == msg02 );
!   VERIFY( msg02 != blank );
! 
!   //
!   // 2: istringstream
!   //
!   // extracts the stored ascii values, placing them in turn in the four vars
! #if 0
!   int i2 = 0;
!   int *pi2 = &i2;
!   double d2 = 0.0;
!   double *pd2 = &d2;
!   std::istringstream istrst01(ostrst02.str());
! 
!   istrst01 >> i2 >> pi2 >> d2 >> pd2;
!   //istrst01 >> i2;
!   //istrst01 >> pi2;
!   VERIFY( i2 == i );
!   VERIFY( d2 == d );
!   VERIFY( pd2 == pd );
!   VERIFY( pi2 == pi );
! #endif
! 
!   // stringstream
!   std::string str1("");
!   std::string str3("this is a somewhat  string");
!   std::stringstream ss1(str1, std::ios_base::in|std::ios_base::out);
!   std::stringstream ss2(str3, std::ios_base::in|std::ios_base::out);
! 
!   return 0;
  }
  
! // user-reported error
! class derived_oss: public std::ostringstream 
! {
! public:
!   derived_oss() : std::ostringstream() {}
! };
! 
! int
! test03()
  {
!   bool test = true;
!   derived_oss yy;
!   yy << "buena vista social club\n";
!   VERIFY( yy.str() == std::string("buena vista social club\n") );
! 
! #ifdef DEBUG_ASSERT
!   assert(test);
! #endif
! 
!   return 0;
! }
  
! int 
! main() 
  {
    test01();
-   test02();
-   test03();
-   
    return 0;
  }
--- 27,60 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
! // 27.7.4 - Template class basic_stringstream
! // NB: This file is for testing basic_stringstream with NO OTHER INCLUDES.
  
! #include <sstream>
  
+ // { dg-do compile }
  
! // libstdc++/7216
! void test01()
  {
!   // Check for required typedefs
!   typedef std::stringstream test_type;
!   typedef test_type::char_type char_type;
!   typedef test_type::traits_type traits_type;
!   typedef test_type::int_type int_type;
!   typedef test_type::pos_type pos_type;
!   typedef test_type::off_type off_type;
  }
  
! namespace test 
  {
!   using namespace std;
!   typedef short type_t;
!   template class basic_stringstream<type_t, char_traits<type_t> >;
! } // test
  
! int main() 
  {
    test01();
    return 0;
  }
Index: testsuite/27_io/stringstream_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/stringstream_members.cc,v
retrieving revision 1.2
diff -c -p -r1.2 stringstream_members.cc
*** testsuite/27_io/stringstream_members.cc	7 Aug 2001 03:38:33 -0000	1.2
--- testsuite/27_io/stringstream_members.cc	26 Jul 2002 01:28:14 -0000
***************
*** 1,6 ****
  // 2001-05-24 Benjamin Kosnik  <bkoz@redhat.com>
  
! // Copyright (C) 2001 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
--- 1,6 ----
  // 2001-05-24 Benjamin Kosnik  <bkoz@redhat.com>
  
! // Copyright (C) 2001, 2002 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
*************** void test02()
*** 120,131 ****
    // These semantics are a joke, a serious defect, and incredibly lame.
  }
  
  int main()
  {
    test01();
    test02();
    return 0;
  }
- 
- 
- 
--- 120,186 ----
    // These semantics are a joke, a serious defect, and incredibly lame.
  }
  
+ void
+ test03()
+ {
+   bool test = true;
+ 
+   //
+   // 1: Automatic formatting of a compound string
+   //
+   int i = 1024;
+   int *pi = &i;
+   double d = 3.14159;
+   double *pd = &d;
+   std::string blank;
+   std::ostringstream ostrst01; 
+   std::ostringstream ostrst02(blank); 
+   
+   // No buffer, so should be created.
+   ostrst01 << "i: " << i << " i's address:  " << pi << "\n"
+ 	     << "d: " << d << " d's address: " << pd << std::endl;
+   // Buffer, so existing buffer should be overwritten.
+   ostrst02 << "i: " << i << " i's address:  " << pi << "\n"
+ 	     << "d: " << d << " d's address: " << pd << std::endl;
+ 
+   std::string msg01 = ostrst01.str();
+   std::string msg02 = ostrst02.str();
+   VERIFY( msg01 == msg02 );
+   VERIFY( msg02 != blank );
+ 
+   //
+   // 2: istringstream
+   //
+   // extracts the stored ascii values, placing them in turn in the four vars
+ #if 0
+   int i2 = 0;
+   //int* pi2 = &i2;
+   void* pi2 = &i2;
+   double d2 = 0.0;
+   //  double* pd2 = &d2;
+   void* pd2 = &d2;
+   std::istringstream istrst01(ostrst02.str());
+ 
+   istrst01 >> i2 >> pi2 >> d2 >> pd2;
+   //istrst01 >> i2;
+   //istrst01 >> pi2;
+   VERIFY( i2 == i );
+   VERIFY( d2 == d );
+   VERIFY( pd2 == pd );
+   VERIFY( pi2 == pi );
+ #endif
+ 
+   // stringstream
+   std::string str1("");
+   std::string str3("this is a somewhat  string");
+   std::stringstream ss1(str1, std::ios_base::in|std::ios_base::out);
+   std::stringstream ss2(str3, std::ios_base::in|std::ios_base::out);
+ }
+ 
  int main()
  {
    test01();
    test02();
+   test03();
    return 0;
  }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]