OSDN Git Service

2003-10-20 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Oct 2003 22:11:40 +0000 (22:11 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Oct 2003 22:11:40 +0000 (22:11 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72728 138bc75d-0d04-0410-961f-82ee72b054a4

17 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/pod_char_traits.h
libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc [new file with mode: 0644]
libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc [new file with mode: 0644]
libstdc++-v3/testsuite/22_locale/numpunct/members/pod/1.cc
libstdc++-v3/testsuite/22_locale/numpunct/members/pod/2.cc
libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc [deleted file]
libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc [deleted file]
libstdc++-v3/testsuite/27_io/basic_istream/sentry/pod/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc [deleted file]
libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc [deleted file]
libstdc++-v3/testsuite/27_io/basic_ostream/sentry/pod/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/testsuite_hooks.cc
libstdc++-v3/testsuite/testsuite_hooks.h

index b93dac9..1493a4d 100644 (file)
@@ -1,3 +1,22 @@
+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.
+
 2003-10-20  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
 
        * config/cpu/mips/atomicity.h (__atomic_add): Use _ABIO32 instead
index 04bc0dd..0519029 100644 (file)
@@ -68,9 +68,12 @@ namespace std
       // 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 streampos                        pos_type;
+      typedef fpos<state_type>                 pos_type;
       typedef streamoff                        off_type;
       
       static void 
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc
new file mode 100644 (file)
index 0000000..fcfcf74
--- /dev/null
@@ -0,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;
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc
new file mode 100644 (file)
index 0000000..908d9b3
--- /dev/null
@@ -0,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 da6a149..7ceda98 100644 (file)
 #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;
+  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<podchar_type>);
-  const numpunct<podchar_type>& np = use_facet<numpunct<podchar_type> >(loc);
+  const locale         loc(locale::classic(), new numpunct<pod_type>);
+  const numpunct<pod_type>& np = use_facet<numpunct<pod_type> >(loc);
 
-  podchar_type dp = np.decimal_point();
-  podchar_type ts = np.thousands_sep();
+  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();
 
-  podchar_type basedp = { value_type('.') };
-  podchar_type basets = { value_type(',') };
+  pod_type basedp = { value_type('.') };
+  pod_type basets = { value_type(',') };
 
-  string_type basetrue(4, podchar_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, podchar_type());
+  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<podchar_type>::eq(dp, basedp) );
-  VERIFY( char_traits<podchar_type>::eq(ts, basets) );
+  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 10b5ded..bb97036 100644 (file)
 #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;
+  using __gnu_test::pod_type;
+
+  typedef numpunct<pod_type>::string_type      string_type;
+  typedef basic_ostringstream<pod_type>                ostream_type;
   
   bool                 test = true;
 
@@ -208,7 +58,7 @@ void test01()
   VERIFY( test );
 
   // 2: fail, no ctype
-  const locale         loc2(loc, new num_put<podchar_type>);
+  const locale         loc2(loc, new num_put<pod_type>);
   os.clear();
   os.imbue(loc2);
   try
@@ -224,7 +74,7 @@ void test01()
   VERIFY( test );
 
   // 3: fail, no numpunct
-  const locale         loc3(loc, new ctype<podchar_type>);
+  const locale         loc3(loc, new ctype<pod_type>);
   os.clear();
   os.imbue(loc3);
   try
@@ -240,7 +90,7 @@ void test01()
   VERIFY( test );
 
   // 4: works.
-  const locale         loc4(loc3, new numpunct<podchar_type>);
+  const locale         loc4(loc3, new numpunct<pod_type>);
   os.clear();
   os.imbue(loc4);
   try
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc
new file mode 100644 (file)
index 0000000..40fc2c4
--- /dev/null
@@ -0,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;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc
new file mode 100644 (file)
index 0000000..78b54f6
--- /dev/null
@@ -0,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;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc
new file mode 100644 (file)
index 0000000..888abe7
--- /dev/null
@@ -0,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;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc b/libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc
deleted file mode 100644 (file)
index d285bc1..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-// 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;
-}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc b/libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc
deleted file mode 100644 (file)
index 0ae9c80..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-// 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;
-}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/sentry/pod/1.cc b/libstdc++-v3/testsuite/27_io/basic_istream/sentry/pod/1.cc
new file mode 100644 (file)
index 0000000..7d89476
--- /dev/null
@@ -0,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;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc
deleted file mode 100644 (file)
index c37c004..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-// 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;
-}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc
deleted file mode 100644 (file)
index 5ace232..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-// 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;
-}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/pod/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/pod/1.cc
new file mode 100644 (file)
index 0000000..95a1682
--- /dev/null
@@ -0,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 a2ace11..2f4add6 100644 (file)
@@ -215,4 +215,156 @@ namespace __gnu_test
   unsigned int assignment_operator::throw_on_ = 0;
   unsigned int destructor::_M_count = 0;
   int copy_tracker::next_id_ = 0;
-}; // namespace __cxx_test
+}; // 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 e688509..d3755c6 100644 (file)
 #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
-#include <locale>
+
 #ifdef _GLIBCXX_HAVE_UNISTD_H
 # include <unistd.h>
 #else
@@ -156,6 +159,10 @@ namespace __gnu_test
     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
@@ -336,51 +343,90 @@ namespace std
     {
       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;
+      typedef fpos<state_type>                 pos_type;
+      typedef streamoff                off_type;
       
       static void 
-      assign(char_type& __c1, const char_type& __c2);
+      assign(char_type& c1, const char_type& c2)
+      { c1.c = c2.c; }
 
       static bool 
-      eq(const char_type& __c1, const char_type& __c2);
+      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);
+      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);
+      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);
+      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);
+      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);
+      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);
+      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);
+      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);
+      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);
+      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);
+      eq_int_type(const int_type& c1, const int_type& c2)
+      { return c1.i == c2.i; }
 
       static int_type 
-      eof();
+      eof()
+      {
+       int_type n;
+       n.i = -10;
+       return n;
+      }
 
       static int_type 
-      not_eof(const int_type& __c);
+      not_eof(const int_type& c)
+      {
+       if (eq_int_type(c, eof()))
+         return int_type();
+       return c;
+      }
     };
 } // namespace std