+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
// 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
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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;
+}
#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 );
#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;
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
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
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
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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;
+}
+++ /dev/null
-// 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;
-}
+++ /dev/null
-// 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;
-}
--- /dev/null
+// 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;
+}
+++ /dev/null
-// 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;
-}
+++ /dev/null
-// 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;
-}
--- /dev/null
+// 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;
+}
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
#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
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
{
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