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] PR/10081


Moves for pod testing of basic_istream and basic_ostream. Some of the
sentry tests were testing formatted input. This should clarify things,
in a consistent manner with the numpunct pod tests.

tested x86/linux

2003-10-20  Benjamin Kosnik  <bkoz@redhat.com>
 
	PR libstdc++/10081
	* testsuite_hooks.h: Add pod_type, ctype and numpunct specializations.
	* testsuite_hooks.cc: Same.
	* 22_locale/numpunct/members/pod/1.cc: Edit.
	* 22_locale/numpunct/members/pod/2.cc: Same.
	* 27_io/basic_istream/sentry/char/3983-fstream.cc: Move ...
	* 27_io/basic_istream/sentry/char/3983-sstream.cc: Move ...
	* 27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc: Here.
	* 27_io/basic_istream/extractors_character/pod/3983-2.cc: Here.
	* 27_io/basic_istream/extractors_other/pod/3983-3.cc: Here.
	* 27_io/basic_ostream/sentry/char/3983-fstream.cc: Remove.
	* 27_io/basic_ostream/sentry/char/3983-sstream.cc: Remove.
	* 27_io/basic_istream/sentry/pod/1.cc: New.
	* 27_io/basic_ostream/sentry/pod/1.cc: New.
	* 21_strings/basic_string/inserters_extractors/pod/10081-in.cc: New.
	* 21_strings/basic_string/inserters_extractors/pod/10081-out.cc: New.

Index: include/ext/pod_char_traits.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/ext/pod_char_traits.h,v
retrieving revision 1.3
diff -c -p -r1.3 pod_char_traits.h
*** include/ext/pod_char_traits.h	17 Jul 2003 04:01:28 -0000	1.3
--- include/ext/pod_char_traits.h	20 Oct 2003 20:27:58 -0000
*************** namespace std
*** 68,76 ****
        // NB: This type should be bigger than char_type, so as to
        // properly hold EOF values in addition to the full range of
        // char_type values.
        typedef typename char_type::int_type	int_type;
        typedef typename char_type::state_type	state_type;
!       typedef streampos 			pos_type;
        typedef streamoff 			off_type;
        
        static void 
--- 68,79 ----
        // NB: This type should be bigger than char_type, so as to
        // properly hold EOF values in addition to the full range of
        // char_type values.
+       // Also, assumes 
+       // int_type(value_type) is valid.
+       // int_type(-1) is possible.
        typedef typename char_type::int_type	int_type;
        typedef typename char_type::state_type	state_type;
!       typedef fpos<state_type>			pos_type;
        typedef streamoff 			off_type;
        
        static void 
Index: testsuite/testsuite_hooks.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/testsuite_hooks.cc,v
retrieving revision 1.16
diff -c -p -r1.16 testsuite_hooks.cc
*** testsuite/testsuite_hooks.cc	28 Jul 2003 17:12:07 -0000	1.16
--- testsuite/testsuite_hooks.cc	20 Oct 2003 20:27:58 -0000
*************** namespace __gnu_test
*** 215,218 ****
    unsigned int assignment_operator::throw_on_ = 0;
    unsigned int destructor::_M_count = 0;
    int copy_tracker::next_id_ = 0;
! }; // namespace __cxx_test
--- 215,370 ----
    unsigned int assignment_operator::throw_on_ = 0;
    unsigned int destructor::_M_count = 0;
    int copy_tracker::next_id_ = 0;
! }; // namespace __gnu_test
! 
! namespace std
! {
!   // Member specializations for the existing facet classes.  
!   // NB: This isn't especially portable. Perhaps a better way would be
!   // to just specialize all of numpunct and ctype.
!   using __gnu_test::int_type;
!   using __gnu_test::value_type;
!   using __gnu_test::pod_type;
! 
!   template<>
!     bool 
!     ctype<pod_type>::
!     do_is(mask, char_type) const { return true; }
! 
!   template<>
!     const pod_type*
!     ctype<pod_type>::
!     do_is(const char_type* __lo, const char_type*, mask*) const
!     { return __lo; }
! 
!   template<>
!     const pod_type*
!     ctype<pod_type>::
!     do_scan_is(mask, const char_type* __lo, const char_type*) const
!     { return __lo; }
! 
!   template<>
!     const pod_type*
!     ctype<pod_type>::
!     do_scan_not(mask, const char_type* __lo, const char_type*) const
!     { return __lo; }
! 
!   template<>
!     pod_type 
!     ctype<pod_type>::
!     do_toupper(char_type __c) const
!     { return __c; }
! 
!   template<>
!     const pod_type*
!     ctype<pod_type>::
!     do_toupper(char_type*, const char_type* __hi) const
!     { return __hi; }
! 
!   template<>
!     pod_type 
!     ctype<pod_type>::
!     do_tolower(char_type __c) const
!     { return __c; }
! 
!   template<>
!     const pod_type*
!     ctype<pod_type>::
!     do_tolower(char_type*, const char_type* __hi) const
!     { return __hi; }
! 
!   template<>
!     pod_type
!     ctype<pod_type>::
!     do_widen(char __c) const
!     { 
!       char_type ret = { value_type(__c) };
!       return ret;
!     }
! 
!   template<>
!     const char*
!     ctype<pod_type>::
!     do_widen(const char* __lo, const char* __hi, char_type* __dest) const
!     {
!       while (__lo < __hi)
! 	{
! 	  *__dest = this->do_widen(*__lo);
! 	  ++__lo;
! 	  ++__dest;
! 	}
!       return __hi;
!     }
! 
!   template<>
!     char
!     ctype<pod_type>::
!     do_narrow(char_type __wc, char) const
!     { return static_cast<char>(__wc.value); }
! 
!   template<>
!     const pod_type*
!     ctype<pod_type>::
!     do_narrow(const pod_type* __lo, const pod_type* __hi, 
! 	      char, char* __dest) const
!     {
!       while (__lo < __hi)
! 	{
! 	  *__dest = this->do_narrow(*__lo, char());
! 	  ++__lo;
! 	  ++__dest;
! 	}
!       return __hi;
!     }
! 
!   template<>
!     ctype<pod_type>::~ctype() { }
! 
!   template<>
!     void
!     numpunct<pod_type>::_M_initialize_numpunct(__c_locale)
!     {
!       if (!_M_data)
! 	_M_data = new __numpunct_cache<pod_type>;
! 
!       _M_data->_M_grouping = "";
!       _M_data->_M_use_grouping = false;
! 
!       _M_data->_M_decimal_point.value =  value_type('.');
!       _M_data->_M_thousands_sep.value = value_type(',');
!       
!       for (size_t i = 0; i < __num_base::_S_oend; ++i)
! 	{
! 	  value_type v = __num_base::_S_atoms_out[i];
! 	  _M_data->_M_atoms_out[i].value = v;
! 	}
!       _M_data->_M_atoms_out[__num_base::_S_oend] = pod_type();
!       
!       for (size_t i = 0; i < __num_base::_S_iend; ++i)
! 	_M_data->_M_atoms_in[i].value = value_type(__num_base::_S_atoms_in[i]);
!       _M_data->_M_atoms_in[__num_base::_S_iend] = pod_type();
! 
!       // "true"
!       pod_type* __truename = new pod_type[4 + 1];
!       __truename[0].value = value_type('t');
!       __truename[1].value = value_type('r');
!       __truename[2].value = value_type('u');
!       __truename[3].value = value_type('e');
!       __truename[4] = pod_type();
!       _M_data->_M_truename = __truename;
! 
!       // "false"
!       pod_type* __falsename = new pod_type[5 + 1];
!       __falsename[0].value = value_type('f');
!       __falsename[1].value = value_type('a');
!       __falsename[2].value = value_type('l');
!       __falsename[3].value = value_type('s');
!       __falsename[4].value = value_type('e');
!       __falsename[5] = pod_type();
!       _M_data->_M_falsename = __falsename;
!     }
! 
!   template<>
!     numpunct<pod_type>::~numpunct()
!     { delete _M_data; }
! } // namespace std
Index: testsuite/testsuite_hooks.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/testsuite_hooks.h,v
retrieving revision 1.23
diff -c -p -r1.23 testsuite_hooks.h
*** testsuite/testsuite_hooks.h	23 Sep 2003 20:02:02 -0000	1.23
--- testsuite/testsuite_hooks.h	20 Oct 2003 20:27:58 -0000
***************
*** 61,73 ****
  #include <bits/c++config.h>
  #include <bits/functexcept.h>
  #include <cstddef>
  #ifdef _GLIBCXX_ASSERT
  # include <cassert>
  # define VERIFY(fn) assert(fn)
  #else
  # define VERIFY(fn) test &= (fn)
  #endif
! #include <locale>
  #ifdef _GLIBCXX_HAVE_UNISTD_H
  # include <unistd.h>
  #else
--- 61,76 ----
  #include <bits/c++config.h>
  #include <bits/functexcept.h>
  #include <cstddef>
+ #include <locale>
+ #include <ext/pod_char_traits.h>
+ 
  #ifdef _GLIBCXX_ASSERT
  # include <cassert>
  # define VERIFY(fn) assert(fn)
  #else
  # define VERIFY(fn) test &= (fn)
  #endif
! 
  #ifdef _GLIBCXX_HAVE_UNISTD_H
  # include <unistd.h>
  #else
*************** namespace __gnu_test
*** 156,161 ****
--- 159,168 ----
      unsigned long l2;
    };
  
+   typedef unsigned short				value_type;
+   typedef unsigned int					int_type;
+   typedef __gnu_cxx::character<value_type, int_type>	pod_type;
+ 
  
    // Counting.
    struct counter
*************** namespace std
*** 336,386 ****
      {
        typedef __gnu_test::pod_char	char_type;
        typedef __gnu_test::pod_int  	int_type;
-       typedef long 			pos_type;
-       typedef long 			off_type;
        typedef __gnu_test::state   	state_type;
        
        static void 
!       assign(char_type& __c1, const char_type& __c2);
  
        static bool 
!       eq(const char_type& __c1, const char_type& __c2);
  
        static bool 
!       lt(const char_type& __c1, const char_type& __c2);
  
        static int 
!       compare(const char_type* __s1, const char_type* __s2, size_t __n);
  
        static size_t
!       length(const char_type* __s);
  
        static const char_type* 
!       find(const char_type* __s, size_t __n, const char_type& __a);
  
        static char_type* 
!       move(char_type* __s1, const char_type* __s2, size_t __n);
  
        static char_type* 
!       copy(char_type* __s1, const char_type* __s2, size_t __n);
  
        static char_type* 
!       assign(char_type* __s, size_t __n, char_type __a);
  
        static char_type 
!       to_char_type(const int_type& __c);
  
        static int_type 
!       to_int_type(const char_type& __c);
  
        static bool 
!       eq_int_type(const int_type& __c1, const int_type& __c2);
  
        static int_type 
!       eof();
  
        static int_type 
!       not_eof(const int_type& __c);
      };
  } // namespace std
  
--- 343,432 ----
      {
        typedef __gnu_test::pod_char	char_type;
        typedef __gnu_test::pod_int  	int_type;
        typedef __gnu_test::state   	state_type;
+       typedef fpos<state_type> 		pos_type;
+       typedef streamoff 		off_type;
        
        static void 
!       assign(char_type& c1, const char_type& c2)
!       { c1.c = c2.c; }
  
        static bool 
!       eq(const char_type& c1, const char_type& c2)
!       { return c1.c == c2.c; }
  
        static bool 
!       lt(const char_type& c1, const char_type& c2)
!       { return c1.c < c2.c; }
  
        static int 
!       compare(const char_type* s1, const char_type* s2, size_t n)
!       { return memcmp(s1, s2, n); }
  
        static size_t
!       length(const char_type* s)
!       { return strlen(reinterpret_cast<const char*>(s)); }
  
        static const char_type* 
!       find(const char_type* s, size_t n, const char_type& a)
!       { return static_cast<const char_type*>(memchr(s, a.c, n)); }
  
        static char_type* 
!       move(char_type* s1, const char_type* s2, size_t n)
!       {
! 	memmove(s1, s2, n);
! 	return s1;
!       }
  
        static char_type* 
!       copy(char_type* s1, const char_type* s2, size_t n)
!       {
! 	memcpy(s1, s2, n);
! 	return s1;
!       }
  
        static char_type* 
!       assign(char_type* s, size_t n, char_type a)
!       {
! 	memset(s, a.c, n);
! 	return s;
!       }
  
        static char_type 
!       to_char_type(const int_type& c)
!       {
! 	char_type ret;
! 	ret.c = static_cast<unsigned char>(c.i);
! 	return ret;
!       }
  
        static int_type 
!       to_int_type(const char_type& c)
!       {
! 	int_type ret;
! 	ret.i = c.c;
! 	return ret;
!       }
  
        static bool 
!       eq_int_type(const int_type& c1, const int_type& c2)
!       { return c1.i == c2.i; }
  
        static int_type 
!       eof()
!       {
! 	int_type n;
! 	n.i = -10;
! 	return n;
!       }
  
        static int_type 
!       not_eof(const int_type& c)
!       {
! 	if (eq_int_type(c, eof()))
! 	  return int_type();
! 	return c;
!       }
      };
  } // namespace std
  
Index: testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc
===================================================================
RCS file: testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc
diff -N testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc	20 Oct 2003 20:27:58 -0000
***************
*** 0 ****
--- 1,90 ----
+ // Copyright (C) 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.6.1.1.2 class basic_istream::sentry
+ 
+ #include <string>
+ #include <istream>
+ #include <sstream>
+ #include <locale>
+ #include <testsuite_hooks.h>
+ 
+ void test01()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   typedef basic_string<pod_type> 	string_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_istream<pod_type> 	istream_type;
+ 
+   bool test __attribute__((unused)) = true;
+ 
+   string_type str;
+   stringbuf_type strbuf01;
+   istream_type stream(&strbuf01);
+ 
+   try
+     {
+       stream >> str;
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Ok, throws bad_cast because locale has no ctype facet.
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
+   stream.imbue(loc);
+   try
+     {
+       stream >> str;
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main()
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc
===================================================================
RCS file: testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc
diff -N testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc	20 Oct 2003 20:27:58 -0000
***************
*** 0 ****
--- 1,90 ----
+ // Copyright (C) 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.6.1.1.2 class basic_istream::sentry
+ 
+ #include <string>
+ #include <ostream>
+ #include <sstream>
+ #include <locale>
+ #include <testsuite_hooks.h>
+ 
+ void test01()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   typedef basic_string<pod_type> 	string_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_ostream<pod_type> 	ostream_type;
+ 
+   bool test __attribute__((unused)) = true;
+ 
+   string_type str;
+   stringbuf_type strbuf01;
+   ostream_type stream(&strbuf01);
+ 
+   try
+     {
+       stream << str;
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Ok, throws bad_cast because locale has no ctype facet.
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
+   stream.imbue(loc);
+   try
+     {
+       stream << str;
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main()
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/22_locale/numpunct/members/pod/1.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/1.cc,v
retrieving revision 1.2
diff -c -p -r1.2 1.cc
*** testsuite/22_locale/numpunct/members/pod/1.cc	23 Sep 2003 20:02:32 -0000	1.2
--- testsuite/22_locale/numpunct/members/pod/1.cc	20 Oct 2003 20:27:58 -0000
***************
*** 25,127 ****
  #include <ext/pod_char_traits.h>
  #include <testsuite_hooks.h>
  
- typedef unsigned short					value_type;
- typedef unsigned int					int_type;
- typedef __gnu_cxx::character<value_type, int_type>	podchar_type;
- 
- // Member specializations for the existing facet classes.
- // NB: This isn't especially portable. Perhaps a better way would be
- // to just specialize all of numpunct and ctype.
- namespace std
- {
-   template<>
-     void
-     numpunct<podchar_type>::_M_initialize_numpunct(__c_locale)
-     {
-       if (!_M_data)
- 	_M_data = new __numpunct_cache<podchar_type>;
- 
-       _M_data->_M_grouping = "";
-       _M_data->_M_use_grouping = false;
- 
-       _M_data->_M_decimal_point.value =  value_type('.');
-       _M_data->_M_thousands_sep.value = value_type(',');
-       
-       for (size_t i = 0; i < __num_base::_S_oend; ++i)
- 	{
- 	  value_type v = __num_base::_S_atoms_out[i];
- 	  _M_data->_M_atoms_out[i].value = v;
- 	}
-       _M_data->_M_atoms_out[__num_base::_S_oend] = podchar_type();
-       
-       for (size_t i = 0; i < __num_base::_S_iend; ++i)
- 	_M_data->_M_atoms_in[i].value = value_type(__num_base::_S_atoms_in[i]);
-       _M_data->_M_atoms_in[__num_base::_S_iend] = podchar_type();
- 
-       // "true"
-       podchar_type* __truename = new podchar_type[4 + 1];
-       __truename[0].value = value_type('t');
-       __truename[1].value = value_type('r');
-       __truename[2].value = value_type('u');
-       __truename[3].value = value_type('e');
-       __truename[4] = podchar_type();
-       _M_data->_M_truename = __truename;
- 
-       // "false"
-       podchar_type* __falsename = new podchar_type[5 + 1];
-       __falsename[0].value = value_type('f');
-       __falsename[1].value = value_type('a');
-       __falsename[2].value = value_type('l');
-       __falsename[3].value = value_type('s');
-       __falsename[4].value = value_type('e');
-       __falsename[5] = podchar_type();
-       _M_data->_M_falsename = __falsename;
-     }
- 
-   template<>
-     numpunct<podchar_type>::~numpunct()
-     { delete _M_data; }
- }
  
  // Check for numpunct and ctype dependencies. Make sure that numpunct
  // can be created without ctype.
  void test01()
  {
    using namespace std;
!   typedef numpunct<podchar_type>::string_type 	string_type;
!   typedef basic_stringbuf<podchar_type> 	stringbuf_type;
!   typedef basic_ostream<podchar_type> 		ostream_type;
    
    bool test __attribute__((unused)) = true;
  
    // Pre-cache sanity check.
!   const locale 	loc(locale::classic(), new numpunct<podchar_type>);
!   const numpunct<podchar_type>& np = use_facet<numpunct<podchar_type> >(loc);
  
!   podchar_type dp = np.decimal_point();
!   podchar_type ts = np.thousands_sep();
    string g = np.grouping();
    string_type strue = np.truename();
    string_type sfalse = np.falsename();
  
!   podchar_type basedp = { value_type('.') };
!   podchar_type basets = { value_type(',') };
  
!   string_type basetrue(4, podchar_type());
    basetrue[0].value = value_type('t');
    basetrue[1].value = value_type('r');
    basetrue[2].value = value_type('u');
    basetrue[3].value = value_type('e');
  
!   string_type basefalse(5, podchar_type());
    basefalse[0].value = value_type('f');
    basefalse[1].value = value_type('a');
    basefalse[2].value = value_type('l');
    basefalse[3].value = value_type('s');
    basefalse[4].value = value_type('e');
  
!   VERIFY( char_traits<podchar_type>::eq(dp, basedp) );
!   VERIFY( char_traits<podchar_type>::eq(ts, basets) );
    VERIFY( g == "" );
    VERIFY( strue == basetrue );
    VERIFY( sfalse == basefalse );
--- 25,72 ----
  #include <ext/pod_char_traits.h>
  #include <testsuite_hooks.h>
  
  
  // Check for numpunct and ctype dependencies. Make sure that numpunct
  // can be created without ctype.
  void test01()
  {
    using namespace std;
!   using __gnu_test::pod_type;
!   using __gnu_test::value_type;
!   typedef numpunct<pod_type>::string_type 	string_type;
!   typedef basic_stringbuf<pod_type> 	stringbuf_type;
!   typedef basic_ostream<pod_type> 		ostream_type;
    
    bool test __attribute__((unused)) = true;
  
    // Pre-cache sanity check.
!   const locale 	loc(locale::classic(), new numpunct<pod_type>);
!   const numpunct<pod_type>& np = use_facet<numpunct<pod_type> >(loc);
  
!   pod_type dp = np.decimal_point();
!   pod_type ts = np.thousands_sep();
    string g = np.grouping();
    string_type strue = np.truename();
    string_type sfalse = np.falsename();
  
!   pod_type basedp = { value_type('.') };
!   pod_type basets = { value_type(',') };
  
!   string_type basetrue(4, pod_type());
    basetrue[0].value = value_type('t');
    basetrue[1].value = value_type('r');
    basetrue[2].value = value_type('u');
    basetrue[3].value = value_type('e');
  
!   string_type basefalse(5, pod_type());
    basefalse[0].value = value_type('f');
    basefalse[1].value = value_type('a');
    basefalse[2].value = value_type('l');
    basefalse[3].value = value_type('s');
    basefalse[4].value = value_type('e');
  
!   VERIFY( char_traits<pod_type>::eq(dp, basedp) );
!   VERIFY( char_traits<pod_type>::eq(ts, basets) );
    VERIFY( g == "" );
    VERIFY( strue == basetrue );
    VERIFY( sfalse == basefalse );
Index: testsuite/22_locale/numpunct/members/pod/2.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/2.cc,v
retrieving revision 1.2
diff -c -p -r1.2 2.cc
*** testsuite/22_locale/numpunct/members/pod/2.cc	23 Sep 2003 20:02:32 -0000	1.2
--- testsuite/22_locale/numpunct/members/pod/2.cc	20 Oct 2003 20:27:58 -0000
***************
*** 25,189 ****
  #include <ext/pod_char_traits.h>
  #include <testsuite_hooks.h>
  
- typedef unsigned short					value_type;
- typedef unsigned int					int_type;
- typedef __gnu_cxx::character<value_type, int_type>	podchar_type;
- 
- // Member specializations for the existing facet classes.
- // NB: This isn't especially portable. Perhaps a better way would be
- // to just specialize all of numpunct and ctype.
- namespace std
- {
-   template<>
-     bool 
-     ctype<podchar_type>::
-     do_is(mask, char_type) const { return true; }
- 
-   template<>
-     const podchar_type*
-     ctype<podchar_type>::
-     do_is(const char_type* __lo, const char_type*, mask*) const
-     { return __lo; }
- 
-   template<>
-     const podchar_type*
-     ctype<podchar_type>::
-     do_scan_is(mask, const char_type* __lo, const char_type*) const
-     { return __lo; }
- 
-   template<>
-     const podchar_type*
-     ctype<podchar_type>::
-     do_scan_not(mask, const char_type* __lo, const char_type*) const
-     { return __lo; }
- 
-   template<>
-     podchar_type 
-     ctype<podchar_type>::
-     do_toupper(char_type __c) const
-     { return __c; }
- 
-   template<>
-     const podchar_type*
-     ctype<podchar_type>::
-     do_toupper(char_type*, const char_type* __hi) const
-     { return __hi; }
- 
-   template<>
-     podchar_type 
-     ctype<podchar_type>::
-     do_tolower(char_type __c) const
-     { return __c; }
- 
-   template<>
-     const podchar_type*
-     ctype<podchar_type>::
-     do_tolower(char_type*, const char_type* __hi) const
-     { return __hi; }
- 
-   template<>
-     podchar_type
-     ctype<podchar_type>::
-     do_widen(char __c) const
-     { 
-       char_type ret = { value_type(__c) };
-       return ret;
-     }
- 
-   template<>
-     const char*
-     ctype<podchar_type>::
-     do_widen(const char* __lo, const char* __hi, char_type* __dest) const
-     {
-       while (__lo < __hi)
- 	{
- 	  *__dest = this->do_widen(*__lo);
- 	  ++__lo;
- 	  ++__dest;
- 	}
-       return __hi;
-     }
- 
-   template<>
-     char
-     ctype<podchar_type>::
-     do_narrow(char_type __wc, char) const
-     { return static_cast<char>(__wc.value); }
- 
-   template<>
-     const podchar_type*
-     ctype<podchar_type>::
-     do_narrow(const podchar_type* __lo, const podchar_type* __hi, 
- 	      char, char* __dest) const
-     {
-       while (__lo < __hi)
- 	{
- 	  *__dest = this->do_narrow(*__lo, char());
- 	  ++__lo;
- 	  ++__dest;
- 	}
-       return __hi;
-     }
- 
-   template<>
-     ctype<podchar_type>::~ctype() { }
- 
-   template<>
-     void
-     numpunct<podchar_type>::_M_initialize_numpunct(__c_locale)
-     {
-       if (!_M_data)
- 	_M_data = new __numpunct_cache<podchar_type>;
- 
-       _M_data->_M_grouping = "";
-       _M_data->_M_use_grouping = false;
- 
-       _M_data->_M_decimal_point.value =  value_type('.');
-       _M_data->_M_thousands_sep.value = value_type(',');
-       
-       for (size_t i = 0; i < __num_base::_S_oend; ++i)
- 	{
- 	  value_type v = __num_base::_S_atoms_out[i];
- 	  _M_data->_M_atoms_out[i].value = v;
- 	}
-       _M_data->_M_atoms_out[__num_base::_S_oend] = podchar_type();
-       
-       for (size_t i = 0; i < __num_base::_S_iend; ++i)
- 	_M_data->_M_atoms_in[i].value = value_type(__num_base::_S_atoms_in[i]);
-       _M_data->_M_atoms_in[__num_base::_S_iend] = podchar_type();
- 
-       // "true"
-       podchar_type* __truename = new podchar_type[4 + 1];
-       __truename[0].value = value_type('t');
-       __truename[1].value = value_type('r');
-       __truename[2].value = value_type('u');
-       __truename[3].value = value_type('e');
-       __truename[4] = podchar_type();
-       _M_data->_M_truename = __truename;
- 
-       // "false"
-       podchar_type* __falsename = new podchar_type[5 + 1];
-       __falsename[0].value = value_type('f');
-       __falsename[1].value = value_type('a');
-       __falsename[2].value = value_type('l');
-       __falsename[3].value = value_type('s');
-       __falsename[4].value = value_type('e');
-       __falsename[5] = podchar_type();
-       _M_data->_M_falsename = __falsename;
-     }
- 
-   template<>
-     numpunct<podchar_type>::~numpunct()
-     { delete _M_data; }
- }
- 
  // Check for numpunct and ctype dependencies. Make sure that numpunct
  // can be created without ctype.
  void test01()
  {
    using namespace std;
!   typedef numpunct<podchar_type>::string_type 	string_type;
!   typedef basic_ostringstream<podchar_type> 		ostream_type;
    
    bool 		test = true;
  
--- 25,39 ----
  #include <ext/pod_char_traits.h>
  #include <testsuite_hooks.h>
  
  // Check for numpunct and ctype dependencies. Make sure that numpunct
  // can be created without ctype.
  void test01()
  {
    using namespace std;
!   using __gnu_test::pod_type;
! 
!   typedef numpunct<pod_type>::string_type 	string_type;
!   typedef basic_ostringstream<pod_type> 		ostream_type;
    
    bool 		test = true;
  
*************** void test01()
*** 208,214 ****
    VERIFY( test );
  
    // 2: fail, no ctype
!   const locale 	loc2(loc, new num_put<podchar_type>);
    os.clear();
    os.imbue(loc2);
    try
--- 58,64 ----
    VERIFY( test );
  
    // 2: fail, no ctype
!   const locale 	loc2(loc, new num_put<pod_type>);
    os.clear();
    os.imbue(loc2);
    try
*************** void test01()
*** 224,230 ****
    VERIFY( test );
  
    // 3: fail, no numpunct
!   const locale 	loc3(loc, new ctype<podchar_type>);
    os.clear();
    os.imbue(loc3);
    try
--- 74,80 ----
    VERIFY( test );
  
    // 3: fail, no numpunct
!   const locale 	loc3(loc, new ctype<pod_type>);
    os.clear();
    os.imbue(loc3);
    try
*************** void test01()
*** 240,246 ****
    VERIFY( test );
  
    // 4: works.
!   const locale 	loc4(loc3, new numpunct<podchar_type>);
    os.clear();
    os.imbue(loc4);
    try
--- 90,96 ----
    VERIFY( test );
  
    // 4: works.
!   const locale 	loc4(loc3, new numpunct<pod_type>);
    os.clear();
    os.imbue(loc4);
    try
Index: testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc
===================================================================
RCS file: testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc
diff -N testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc	20 Oct 2003 20:27:58 -0000
***************
*** 0 ****
--- 1,77 ----
+ // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
+ 
+ // Copyright (C) 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.4.2.1.6 class ios_base::init
+ 
+ #include <sstream>
+ #include <typeinfo>
+ #include <testsuite_hooks.h>
+ 
+ // libstdc++/3983
+ // Sentry uses locale info, so have to try one formatted input/output.
+ void test03()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   using __gnu_test::value_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_istream<pod_type> 	istream_type;
+ 
+   stringbuf_type strbuf01;
+   istream_type iss(&strbuf01);
+ 
+   bool test __attribute__((unused)) = true;
+ 
+   try 
+     { 
+       int i;
+       iss >> i;
+     }
+   catch (std::bad_cast& obj)
+     { }
+   catch (std::exception& obj)
+     { VERIFY( false ); }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main()
+ {
+   test03();
+   return 0;
+ }
Index: testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc
===================================================================
RCS file: testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc
diff -N testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc	20 Oct 2003 20:27:58 -0000
***************
*** 0 ****
--- 1,80 ----
+ // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
+ 
+ // Copyright (C) 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.4.2.1.6 class ios_base::init
+ 
+ #include <sstream>
+ #include <typeinfo>
+ #include <testsuite_hooks.h>
+ 
+ // libstdc++/3983
+ // Sentry uses locale info, so have to try one formatted input/output.
+ void test03()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   using __gnu_test::value_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_istream<pod_type> 	istream_type;
+ 
+   stringbuf_type strbuf01;
+   istream_type iss(&strbuf01);
+ 
+   bool test __attribute__((unused)) = true;
+ 
+   // input streams
+   pod_type arr[6] = { value_type('a'), value_type('b'), 
+ 		      value_type('c'), value_type('d'), value_type('e') };
+ 
+   try 
+     { 
+       iss >> arr;
+     }
+   catch (std::bad_cast& obj)
+     { }
+   catch (std::exception& obj)
+     { VERIFY( false ); }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main()
+ {
+   test03();
+   return 0;
+ }
Index: testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc
===================================================================
RCS file: testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc
diff -N testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc	20 Oct 2003 20:27:59 -0000
***************
*** 0 ****
--- 1,76 ----
+ // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
+ 
+ // Copyright (C) 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.4.2.1.6 class ios_base::init
+ 
+ #include <sstream>
+ #include <typeinfo>
+ #include <testsuite_hooks.h>
+ 
+ // libstdc++/3983
+ // Sentry uses locale info, so have to try one formatted input/output.
+ void test03()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   using __gnu_test::value_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_istream<pod_type> 	istream_type;
+ 
+   stringbuf_type strbuf01;
+   istream_type iss(&strbuf01);
+ 
+   bool test __attribute__((unused)) = true;
+   
+   try 
+     { 
+       iss >> std::ws;
+     }
+   catch (std::bad_cast& obj)
+     { }
+   catch (std::exception& obj)
+     { VERIFY( false ); }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main()
+ {
+   test03();
+   return 0;
+ }
Index: testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc
===================================================================
RCS file: testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc
diff -N testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc
*** testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc	26 Sep 2003 20:20:55 -0000	1.8
--- /dev/null	1 Jan 1970 00:00:00 -0000
***************
*** 1,188 ****
- // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
- 
- // Copyright (C) 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.4.2.1.6 class ios_base::init
- 
- #include <fstream>
- #include <typeinfo>
- #include <testsuite_hooks.h>
- 
- // char_traits specialization
- namespace std
- {
-   template<>
-     struct char_traits<unsigned char>
-     {
-       typedef unsigned char 	char_type;
-       // Unsigned as wint_t in unsigned.
-       typedef unsigned long  	int_type;
-       typedef streampos 	pos_type;
-       typedef streamoff 	off_type;
-       typedef mbstate_t 	state_type;
-       
-       static void 
-       assign(char_type& __c1, const char_type& __c2)
-       { __c1 = __c2; }
- 
-       static bool 
-       eq(const char_type& __c1, const char_type& __c2)
-       { return __c1 == __c2; }
- 
-       static bool 
-       lt(const char_type& __c1, const char_type& __c2)
-       { return __c1 < __c2; }
- 
-       static int 
-       compare(const char_type* __s1, const char_type* __s2, size_t __n)
-       { 
- 	for (size_t __i = 0; __i < __n; ++__i)
- 	  if (!eq(__s1[__i], __s2[__i]))
- 	    return lt(__s1[__i], __s2[__i]) ? -1 : 1;
- 	return 0; 
-       }
- 
-       static size_t
-       length(const char_type* __s)
-       { 
- 	const char_type* __p = __s; 
- 	while (__p && *__p) 
- 	  ++__p; 
- 	return (__p - __s); 
-       }
- 
-       static const char_type* 
-       find(const char_type* __s, size_t __n, const char_type& __a)
-       { 
- 	for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
- 	  if (*__p == __a) return __p;
- 	return 0;
-       }
- 
-       static char_type* 
-       move(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       copy(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       assign(char_type* __s, size_t __n, char_type __a)
-       { 
- 	for (char_type* __p = __s; __p < __s + __n; ++__p) 
- 	  assign(*__p, __a);
-         return __s; 
-       }
- 
-       static char_type 
-       to_char_type(const int_type& __c)
-       { return char_type(); }
- 
-       static int_type 
-       to_int_type(const char_type& __c) { return int_type(); }
- 
-       static bool 
-       eq_int_type(const int_type& __c1, const int_type& __c2)
-       { return __c1 == __c2; }
- 
-       static int_type 
-       eof() { return static_cast<int_type>(-1); }
- 
-       static int_type 
-       not_eof(const int_type& __c)
-       { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
-     };
- } // namespace std
- 
- // libstdc++/3983
- // Sentry uses locale info, so have to try one formatted input/output.
- void test03()
- {
-   bool test __attribute__((unused)) = true;
- 
-   // input streams
-   std::basic_ifstream<unsigned char> ifs_uc;
-   unsigned char arr[6] = { 'a', 'b', 'c', 'd', 'e' };
-   try 
-     { 
-       int i;
-       ifs_uc >> i;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-   
-   try 
-     { 
-       ifs_uc >> arr;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-   
-   try 
-     { 
-       ifs_uc >> std::ws;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-  
-   try 
-     { 
-       std::basic_string<unsigned char> s_uc(arr);
-       ifs_uc >> s_uc;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-    
-   VERIFY( test );
- }
- 
- #if !__GXX_WEAK__
- // Explicitly instantiate for systems with no COMDAT or weak support.
- template 
-   std::basic_string<unsigned char>::size_type 
-   std::basic_string<unsigned char>::_Rep::_S_max_size;
- 
- template 
-   unsigned char
-   std::basic_string<unsigned char>::_Rep::_S_terminal;
- #endif
- 
- int main()
- {
-   test03();
-   return 0;
- }
--- 0 ----
Index: testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc
===================================================================
RCS file: testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc
diff -N testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc
*** testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc	26 Sep 2003 20:20:55 -0000	1.4
--- /dev/null	1 Jan 1970 00:00:00 -0000
***************
*** 1,189 ****
- // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
- 
- // Copyright (C) 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.4.2.1.6 class ios_base::init
- 
- #include <sstream>
- #include <typeinfo>
- #include <testsuite_hooks.h>
- 
- // char_traits specialization
- namespace std
- {
-   template<>
-     struct char_traits<unsigned char>
-     {
-       typedef unsigned char 	char_type;
-       // Unsigned as wint_t in unsigned.
-       typedef unsigned long  	int_type;
-       typedef streampos 	pos_type;
-       typedef streamoff 	off_type;
-       typedef mbstate_t 	state_type;
-       
-       static void 
-       assign(char_type& __c1, const char_type& __c2)
-       { __c1 = __c2; }
- 
-       static bool 
-       eq(const char_type& __c1, const char_type& __c2)
-       { return __c1 == __c2; }
- 
-       static bool 
-       lt(const char_type& __c1, const char_type& __c2)
-       { return __c1 < __c2; }
- 
-       static int 
-       compare(const char_type* __s1, const char_type* __s2, size_t __n)
-       { 
- 	for (size_t __i = 0; __i < __n; ++__i)
- 	  if (!eq(__s1[__i], __s2[__i]))
- 	    return lt(__s1[__i], __s2[__i]) ? -1 : 1;
- 	return 0; 
-       }
- 
-       static size_t
-       length(const char_type* __s)
-       { 
- 	const char_type* __p = __s; 
- 	while (__p && *__p) 
- 	  ++__p; 
- 	return (__p - __s); 
-       }
- 
-       static const char_type* 
-       find(const char_type* __s, size_t __n, const char_type& __a)
-       { 
- 	for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
- 	  if (*__p == __a) return __p;
- 	return 0;
-       }
- 
-       static char_type* 
-       move(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       copy(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       assign(char_type* __s, size_t __n, char_type __a)
-       { 
- 	for (char_type* __p = __s; __p < __s + __n; ++__p) 
- 	  assign(*__p, __a);
-         return __s; 
-       }
- 
-       static char_type 
-       to_char_type(const int_type& __c)
-       { return char_type(); }
- 
-       static int_type 
-       to_int_type(const char_type& __c) { return int_type(); }
- 
-       static bool 
-       eq_int_type(const int_type& __c1, const int_type& __c2)
-       { return __c1 == __c2; }
- 
-       static int_type 
-       eof() { return static_cast<int_type>(-1); }
- 
-       static int_type 
-       not_eof(const int_type& __c)
-       { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
-     };
- } // namespace std
- 
- // libstdc++/3983
- // Sentry uses locale info, so have to try one formatted input/output.
- void test03()
- {
-   bool test __attribute__((unused)) = true;
- 
-   // input streams
-   std::basic_istringstream<unsigned char> iss_uc;
-   unsigned char arr[6] = { 'a', 'b', 'c', 'd', 'e' };
- 
-   try 
-     { 
-       int i;
-       iss_uc >> i;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-   
-   try 
-     { 
-       iss_uc >> arr;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-   
-   try 
-     { 
-       iss_uc >> std::ws;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-  
-   try 
-     { 
-       std::basic_string<unsigned char> s_uc(arr);
-       iss_uc >> s_uc;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }
-    
-   VERIFY( test );
- }
- 
- #if !__GXX_WEAK__
- // Explicitly instantiate for systems with no COMDAT or weak support.
- template 
-   std::basic_string<unsigned char>::size_type 
-   std::basic_string<unsigned char>::_Rep::_S_max_size;
- 
- template 
-   unsigned char
-   std::basic_string<unsigned char>::_Rep::_S_terminal;
- #endif
- 
- int main()
- {
-   test03();
-   return 0;
- }
--- 0 ----
Index: testsuite/27_io/basic_istream/sentry/pod/1.cc
===================================================================
RCS file: testsuite/27_io/basic_istream/sentry/pod/1.cc
diff -N testsuite/27_io/basic_istream/sentry/pod/1.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/basic_istream/sentry/pod/1.cc	20 Oct 2003 20:27:59 -0000
***************
*** 0 ****
--- 1,172 ----
+ // 1999-10-14 bkoz
+ 
+ // Copyright (C) 1999, 2001, 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.6.1.1.2 class basic_istream::sentry
+ 
+ #include <istream>
+ #include <sstream>
+ #include <ext/pod_char_traits.h>
+ #include <testsuite_hooks.h>
+ 
+ void test01()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   typedef basic_string<pod_type> 	string_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_istream<pod_type> 	istream_type;
+ 
+   bool test __attribute__((unused)) = true;
+ 
+ 
+   const string_type str01;
+   stringbuf_type strbuf01;
+   stringbuf_type strbuf02(str01);
+   istream_type istr01(&strbuf01);
+   istream_type istr02(&strbuf02);
+   
+   // test negatives
+   try
+     {
+       istream_type::sentry sentry01(istr01);	
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Ok, throws bad_cast because locale has no ctype facet.
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   try
+     {
+       istream_type::sentry sentry02(istr01, true);
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Ok, throws bad_cast because locale has no ctype facet.
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   // imbued.
+   const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
+   istr01.imbue(loc);
+   try
+     {
+       istream_type::sentry sentry01(istr01);	
+       VERIFY( bool(sentry01) == false ); 
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   try
+     {
+       istream_type::sentry sentry02(istr01, true);
+       VERIFY( bool(sentry02) == false ); 
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   // test positive 
+   try
+     {
+       istream_type::sentry sentry03(istr02);	
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Ok, throws bad_cast because locale has no ctype facet.
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   try
+     {
+       istream_type::sentry sentry04(istr02, true);
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Ok, throws bad_cast because locale has no ctype facet.
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   // imbued.
+   istr02.imbue(loc);
+   try
+     {
+       istr02.clear();
+       istream_type::sentry sentry03(istr02);	
+       // ... as eofbit set.
+       VERIFY( bool(sentry03) == false ); 
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   try
+     {
+       istr02.clear();
+       istream_type::sentry sentry04(istr02, true);
+       VERIFY( bool(sentry04) == true ); 
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }
Index: testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc
===================================================================
RCS file: testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc
diff -N testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc
*** testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc	26 Sep 2003 20:20:55 -0000	1.8
--- /dev/null	1 Jan 1970 00:00:00 -0000
***************
*** 1,158 ****
- // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
- 
- // Copyright (C) 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.4.2.1.6 class ios_base::init
- 
- #include <fstream>
- #include <typeinfo>
- #include <testsuite_hooks.h>
- 
- // char_traits specialization
- namespace std
- {
-   template<>
-     struct char_traits<unsigned char>
-     {
-       typedef unsigned char 	char_type;
-       // Unsigned as wint_t in unsigned.
-       typedef unsigned long  	int_type;
-       typedef streampos 	pos_type;
-       typedef streamoff 	off_type;
-       typedef mbstate_t 	state_type;
-       
-       static void 
-       assign(char_type& __c1, const char_type& __c2)
-       { __c1 = __c2; }
- 
-       static bool 
-       eq(const char_type& __c1, const char_type& __c2)
-       { return __c1 == __c2; }
- 
-       static bool 
-       lt(const char_type& __c1, const char_type& __c2)
-       { return __c1 < __c2; }
- 
-       static int 
-       compare(const char_type* __s1, const char_type* __s2, size_t __n)
-       { 
- 	for (size_t __i = 0; __i < __n; ++__i)
- 	  if (!eq(__s1[__i], __s2[__i]))
- 	    return lt(__s1[__i], __s2[__i]) ? -1 : 1;
- 	return 0; 
-       }
- 
-       static size_t
-       length(const char_type* __s)
-       { 
- 	const char_type* __p = __s; 
- 	while (__p && *__p) 
- 	  ++__p; 
- 	return (__p - __s); 
-       }
- 
-       static const char_type* 
-       find(const char_type* __s, size_t __n, const char_type& __a)
-       { 
- 	for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
- 	  if (*__p == __a) return __p;
- 	return 0;
-       }
- 
-       static char_type* 
-       move(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       copy(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       assign(char_type* __s, size_t __n, char_type __a)
-       { 
- 	for (char_type* __p = __s; __p < __s + __n; ++__p) 
- 	  assign(*__p, __a);
-         return __s; 
-       }
- 
-       static char_type 
-       to_char_type(const int_type& __c)
-       { return char_type(); }
- 
-       static int_type 
-       to_int_type(const char_type& __c) { return int_type(); }
- 
-       static bool 
-       eq_int_type(const int_type& __c1, const int_type& __c2)
-       { return __c1 == __c2; }
- 
-       static int_type 
-       eof() { return static_cast<int_type>(-1); }
- 
-       static int_type 
-       not_eof(const int_type& __c)
-       { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
-     };
- } // namespace std
- 
- // libstdc++/3983
- // Sentry uses locale info, so have to try one formatted input/output.
- void test03()
- {
-   bool test __attribute__((unused)) = true;
- 
-   // output streams
-   std::basic_ofstream<unsigned char> ofs_uc;
-   try 
-     { 
-       bool b = true;
-       ofs_uc << b;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }   
-   VERIFY( test );
- }
- 
- #if !__GXX_WEAK__
- // Explicitly instantiate for systems with no COMDAT or weak support.
- template 
-   std::basic_string<unsigned char>::size_type 
-   std::basic_string<unsigned char>::_Rep::_S_max_size;
- 
- template 
-   unsigned char
-   std::basic_string<unsigned char>::_Rep::_S_terminal;
- #endif
- 
- int main()
- {
-   test03();
-   return 0;
- }
--- 0 ----
Index: testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc
===================================================================
RCS file: testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc
diff -N testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc
*** testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc	26 Sep 2003 20:20:55 -0000	1.4
--- /dev/null	1 Jan 1970 00:00:00 -0000
***************
*** 1,158 ****
- // 2001-06-05 Benjamin Kosnik  <bkoz@redhat.com>
- 
- // Copyright (C) 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.4.2.1.6 class ios_base::init
- 
- #include <sstream>
- #include <typeinfo>
- #include <testsuite_hooks.h>
- 
- // char_traits specialization
- namespace std
- {
-   template<>
-     struct char_traits<unsigned char>
-     {
-       typedef unsigned char 	char_type;
-       // Unsigned as wint_t in unsigned.
-       typedef unsigned long  	int_type;
-       typedef streampos 	pos_type;
-       typedef streamoff 	off_type;
-       typedef mbstate_t 	state_type;
-       
-       static void 
-       assign(char_type& __c1, const char_type& __c2)
-       { __c1 = __c2; }
- 
-       static bool 
-       eq(const char_type& __c1, const char_type& __c2)
-       { return __c1 == __c2; }
- 
-       static bool 
-       lt(const char_type& __c1, const char_type& __c2)
-       { return __c1 < __c2; }
- 
-       static int 
-       compare(const char_type* __s1, const char_type* __s2, size_t __n)
-       { 
- 	for (size_t __i = 0; __i < __n; ++__i)
- 	  if (!eq(__s1[__i], __s2[__i]))
- 	    return lt(__s1[__i], __s2[__i]) ? -1 : 1;
- 	return 0; 
-       }
- 
-       static size_t
-       length(const char_type* __s)
-       { 
- 	const char_type* __p = __s; 
- 	while (__p && *__p) 
- 	  ++__p; 
- 	return (__p - __s); 
-       }
- 
-       static const char_type* 
-       find(const char_type* __s, size_t __n, const char_type& __a)
-       { 
- 	for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
- 	  if (*__p == __a) return __p;
- 	return 0;
-       }
- 
-       static char_type* 
-       move(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       copy(char_type* __s1, const char_type* __s2, size_t __n)
-       { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
- 
-       static char_type* 
-       assign(char_type* __s, size_t __n, char_type __a)
-       { 
- 	for (char_type* __p = __s; __p < __s + __n; ++__p) 
- 	  assign(*__p, __a);
-         return __s; 
-       }
- 
-       static char_type 
-       to_char_type(const int_type& __c)
-       { return char_type(); }
- 
-       static int_type 
-       to_int_type(const char_type& __c) { return int_type(); }
- 
-       static bool 
-       eq_int_type(const int_type& __c1, const int_type& __c2)
-       { return __c1 == __c2; }
- 
-       static int_type 
-       eof() { return static_cast<int_type>(-1); }
- 
-       static int_type 
-       not_eof(const int_type& __c)
-       { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
-     };
- } // namespace std
- 
- // libstdc++/3983
- // Sentry uses locale info, so have to try one formatted input/output.
- void test03()
- {
-   bool test __attribute__((unused)) = true;
- 
-   // output streams
-   std::basic_ostringstream<unsigned char> oss_uc;
-   try 
-     { 
-       bool b = true;
-       oss_uc << b;
-     }
-   catch (std::bad_cast& obj)
-     { }
-   catch (std::exception& obj)
-     { test = false; }   
-   VERIFY( test );
- }
- 
- #if !__GXX_WEAK__
- // Explicitly instantiate for systems with no COMDAT or weak support.
- template 
-   std::basic_string<unsigned char>::size_type 
-   std::basic_string<unsigned char>::_Rep::_S_max_size;
- 
- template 
-   unsigned char
-   std::basic_string<unsigned char>::_Rep::_S_terminal;
- #endif
- 
- int main()
- {
-   test03();
-   return 0;
- }
--- 0 ----
Index: testsuite/27_io/basic_ostream/sentry/pod/1.cc
===================================================================
RCS file: testsuite/27_io/basic_ostream/sentry/pod/1.cc
diff -N testsuite/27_io/basic_ostream/sentry/pod/1.cc
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/27_io/basic_ostream/sentry/pod/1.cc	20 Oct 2003 20:27:59 -0000
***************
*** 0 ****
--- 1,128 ----
+ // 1999-10-14 bkoz
+ 
+ // Copyright (C) 1999, 2001, 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.6.1.1.2 class basic_istream::sentry
+ 
+ #include <ostream>
+ #include <sstream>
+ #include <ext/pod_char_traits.h>
+ #include <testsuite_hooks.h>
+ 
+ void test01()
+ {
+   using namespace std;
+   using __gnu_test::pod_type;
+   typedef basic_string<pod_type> 	string_type;
+   typedef basic_stringbuf<pod_type> 	stringbuf_type;
+   typedef basic_ostream<pod_type> 	ostream_type;
+ 
+   bool test __attribute__((unused)) = true;
+ 
+ 
+   const string_type str01;
+   stringbuf_type* strbuf01 = NULL;
+   stringbuf_type strbuf02(str01);
+   ostream_type ostr01(strbuf01);
+   ostream_type ostr02(&strbuf02);
+   
+   // test negatives
+   try
+     {
+       ostream_type::sentry sentry01(ostr01);	
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Not ok, throws bad_cast because locale has no ctype facet,
+       // but none is needed for ostream::sentry.
+       VERIFY( false );
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   // imbued.
+   const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
+   ostr01.imbue(loc);
+   try
+     {
+       ostream_type::sentry sentry01(ostr01);	
+       VERIFY( bool(sentry01) == false ); 
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   // test positive 
+   try
+     {
+       ostream_type::sentry sentry03(ostr02);	
+     }
+   catch (std::bad_cast& obj)
+     {
+       // Not ok, throws bad_cast because locale has no ctype facet,
+       // but none is needed for ostream::sentry.
+       VERIFY( false );
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ 
+   // imbued.
+   ostr02.clear();
+   ostr02.imbue(loc);
+   try
+     {
+       ostream_type::sentry sentry03(ostr02);	
+       VERIFY( bool(sentry03) == true ); 
+     }
+   catch (...)
+     {
+       VERIFY( false );
+     }
+ }
+ 
+ #if !__GXX_WEAK__
+ // Explicitly instantiate for systems with no COMDAT or weak support.
+ template 
+   std::basic_string<__gnu_test::pod_type>::size_type 
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
+ 
+ template 
+   __gnu_test::pod_type
+   std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
+ #endif
+ 
+ int main() 
+ {
+   test01();
+   return 0;
+ }


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