diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2003-10-20 22:11:40 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2003-10-20 22:11:40 +0000 |
commit | 9540958eff5708adcb43b901c168ca00f8a86f3a (patch) | |
tree | abc2a8445881711de975f687d0dc599d65f7e072 | |
parent | ac054e28e69292ed10814619d7c822042b318d0a (diff) | |
download | gcc-9540958eff5708adcb43b901c168ca00f8a86f3a.zip gcc-9540958eff5708adcb43b901c168ca00f8a86f3a.tar.gz gcc-9540958eff5708adcb43b901c168ca00f8a86f3a.tar.bz2 |
re PR libstdc++/10081 (basic_ios::_M_cache_locale leaves NULL members in the face of unknown locales)
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.
From-SVN: r72728
17 files changed, 974 insertions, 939 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b93dac9..1493a4d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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 diff --git a/libstdc++-v3/include/ext/pod_char_traits.h b/libstdc++-v3/include/ext/pod_char_traits.h index 04bc0dd..0519029 100644 --- a/libstdc++-v3/include/ext/pod_char_traits.h +++ b/libstdc++-v3/include/ext/pod_char_traits.h @@ -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 index 0000000..fcfcf74 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-in.cc @@ -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 index 0000000..908d9b3 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/pod/10081-out.cc @@ -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; +} diff --git a/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/1.cc b/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/1.cc index da6a149..7ceda98 100644 --- a/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/1.cc +++ b/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/1.cc @@ -25,103 +25,48 @@ #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 ); diff --git a/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/2.cc b/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/2.cc index 10b5ded..bb97036 100644 --- a/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/2.cc +++ b/libstdc++-v3/testsuite/22_locale/numpunct/members/pod/2.cc @@ -25,165 +25,15 @@ #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 index 0000000..40fc2c4 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc @@ -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 index 0000000..78b54f6 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/pod/3983-2.cc @@ -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 index 0000000..888abe7 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/pod/3983-3.cc @@ -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 index d285bc1..0000000 --- a/libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-fstream.cc +++ /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 index 0ae9c80..0000000 --- a/libstdc++-v3/testsuite/27_io/basic_istream/sentry/char/3983-sstream.cc +++ /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 index 0000000..7d89476 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/sentry/pod/1.cc @@ -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 index c37c004..0000000 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-fstream.cc +++ /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 index 5ace232..0000000 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/char/3983-sstream.cc +++ /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 index 0000000..95a1682 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/sentry/pod/1.cc @@ -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; +} diff --git a/libstdc++-v3/testsuite/testsuite_hooks.cc b/libstdc++-v3/testsuite/testsuite_hooks.cc index a2ace11..2f4add6 100644 --- a/libstdc++-v3/testsuite/testsuite_hooks.cc +++ b/libstdc++-v3/testsuite/testsuite_hooks.cc @@ -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 diff --git a/libstdc++-v3/testsuite/testsuite_hooks.h b/libstdc++-v3/testsuite/testsuite_hooks.h index e688509..d3755c6 100644 --- a/libstdc++-v3/testsuite/testsuite_hooks.h +++ b/libstdc++-v3/testsuite/testsuite_hooks.h @@ -61,13 +61,16 @@ #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 |