aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2005-04-29 18:50:00 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2005-04-29 18:50:00 +0000
commita70c902e06cb7fd86e5f7f7524cd7e4200cba0db (patch)
tree46a68024b46ac9b5e42fe36270112667cbeeb1dc /libstdc++-v3
parentb61ae8b2611643a3f7005680573e4f13dcf9ef23 (diff)
downloadgcc-a70c902e06cb7fd86e5f7f7524cd7e4200cba0db.zip
gcc-a70c902e06cb7fd86e5f7f7524cd7e4200cba0db.tar.gz
gcc-a70c902e06cb7fd86e5f7f7524cd7e4200cba0db.tar.bz2
re PR libstdc++/21238 (conflicting "typedef __numpunct_cache<_CharT> __cache_type;" in std::numpunct<CharT> makes specialization impossible)
2005-04-29 Paolo Carlini <pcarlini@suse.de> PR libstdc++/21238 * include/bits/locale_facets.tcc (num_get::_M_extract_float, num_get::_M_extract_int, num_get::do_get(bool&), num_put::_M_insert_int, num_put::_M_insert_float, num_put::do_put(bool), money_get::_M_extract, money_put::_M_insert): Adjust the __cache_type typedef not to forward to a numpunct/moneypunct typedef. * testsuite/testsuite_character.h: Add pod_uint and its numpunct and moneypunct specializations. * testsuite/testsuite_character.cc: Add numpunct<pod_uint>::id and moneypunct<pod_uint>::id. * testsuite/22_locale/num_get/3.cc: New. * testsuite/22_locale/num_put/3.cc: Likewise. * testsuite/22_locale/money_get/3.cc: Likewise. * testsuite/22_locale/money_put/3.cc: Likewise. * include/bits/locale_facets.tcc (money_put::_M_insert, time_get::_M_extract_name): Prefer operator== to operator!= on char_types. From-SVN: r99012
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog22
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc24
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get/3.cc41
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_put/3.cc41
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_get/3.cc41
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_put/3.cc41
-rw-r--r--libstdc++-v3/testsuite/testsuite_character.cc6
-rw-r--r--libstdc++-v3/testsuite/testsuite_character.h155
8 files changed, 358 insertions, 13 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 9797785..164aee4 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,27 @@
2005-04-29 Paolo Carlini <pcarlini@suse.de>
+ PR libstdc++/21238
+ * include/bits/locale_facets.tcc (num_get::_M_extract_float,
+ num_get::_M_extract_int, num_get::do_get(bool&),
+ num_put::_M_insert_int, num_put::_M_insert_float,
+ num_put::do_put(bool), money_get::_M_extract,
+ money_put::_M_insert): Adjust the __cache_type typedef not to
+ forward to a numpunct/moneypunct typedef.
+ * testsuite/testsuite_character.h: Add pod_uint and its numpunct
+ and moneypunct specializations.
+ * testsuite/testsuite_character.cc: Add numpunct<pod_uint>::id
+ and moneypunct<pod_uint>::id.
+ * testsuite/22_locale/num_get/3.cc: New.
+ * testsuite/22_locale/num_put/3.cc: Likewise.
+ * testsuite/22_locale/money_get/3.cc: Likewise.
+ * testsuite/22_locale/money_put/3.cc: Likewise.
+
+ * include/bits/locale_facets.tcc (money_put::_M_insert,
+ time_get::_M_extract_name): Prefer operator== to operator!=
+ on char_types.
+
+2005-04-29 Paolo Carlini <pcarlini@suse.de>
+
* include/tr1/type_traits (is_convertible): Adjust according
to the resolution of TR1 issue 3.20.
* testsuite/tr1/4_metaprogramming/relationships_between_types/
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index 436fe9d..ff54c93 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -277,7 +277,7 @@ namespace std
ios_base::iostate& __err, string& __xtrc) const
{
typedef char_traits<_CharT> __traits_type;
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -462,8 +462,8 @@ namespace std
ios_base::iostate& __err, _ValueT& __v) const
{
typedef char_traits<_CharT> __traits_type;
- typedef typename __to_unsigned_type<_ValueT>::__type __unsigned_type;
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef typename __to_unsigned_type<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -650,7 +650,7 @@ namespace std
else
{
// Parse bool values as alphanumeric.
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -915,7 +915,7 @@ namespace std
_M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill,
_ValueT __v) const
{
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -1038,7 +1038,7 @@ namespace std
_M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
_ValueT __v) const
{
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -1165,7 +1165,7 @@ namespace std
}
else
{
- typedef typename numpunct<_CharT>::__cache_type __cache_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
@@ -1259,8 +1259,7 @@ namespace std
typedef char_traits<_CharT> __traits_type;
typedef typename string_type::size_type size_type;
typedef money_base::part part;
- typedef moneypunct<_CharT, _Intl> __moneypunct_type;
- typedef typename __moneypunct_type::__cache_type __cache_type;
+ typedef __moneypunct_cache<_CharT, _Intl> __cache_type;
const locale& __loc = __io._M_getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
@@ -1518,8 +1517,7 @@ namespace std
{
typedef typename string_type::size_type size_type;
typedef money_base::part part;
- typedef moneypunct<_CharT, _Intl> __moneypunct_type;
- typedef typename __moneypunct_type::__cache_type __cache_type;
+ typedef __moneypunct_cache<_CharT, _Intl> __cache_type;
const locale& __loc = __io._M_getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
@@ -1535,7 +1533,7 @@ namespace std
money_base::pattern __p;
const char_type* __sign;
size_type __sign_size;
- if (*__beg != __lit[money_base::_S_minus])
+ if (!(*__beg == __lit[money_base::_S_minus]))
{
__p = __lc->_M_pos_format;
__sign = __lc->_M_positive_sign;
@@ -2020,7 +2018,7 @@ namespace std
for (size_t __i3 = 0; __i3 < __nmatches;)
{
__name = __names[__matches[__i3]];
- if (__name[__pos] != *__beg)
+ if (!(__name[__pos] == *__beg))
__matches[__i3] = __matches[--__nmatches];
else
++__i3;
diff --git a/libstdc++-v3/testsuite/22_locale/money_get/3.cc b/libstdc++-v3/testsuite/22_locale/money_get/3.cc
new file mode 100644
index 0000000..d2278f2
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/money_get/3.cc
@@ -0,0 +1,41 @@
+// 2005-04-29 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 Free Software Foundation
+//
+// 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.
+
+// 22.2.6.1 Template class money_get
+
+// { dg-do compile }
+
+#include <locale>
+#include <testsuite_character.h>
+
+class gnu_money_get: public std::money_get<__gnu_test::pod_uint>
+{ };
+
+// libstdc++/21238
+void test01()
+{
+ gnu_money_get facet01;
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/22_locale/money_put/3.cc b/libstdc++-v3/testsuite/22_locale/money_put/3.cc
new file mode 100644
index 0000000..700b07e
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/money_put/3.cc
@@ -0,0 +1,41 @@
+// 2005-04-29 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 Free Software Foundation
+//
+// 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.
+
+// 22.2.6.2 Template class money_put
+
+// { dg-do compile }
+
+#include <locale>
+#include <testsuite_character.h>
+
+class gnu_money_put: public std::money_put<__gnu_test::pod_uint>
+{ };
+
+// libstdc++/21238
+void test01()
+{
+ gnu_money_put facet01;
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/22_locale/num_get/3.cc b/libstdc++-v3/testsuite/22_locale/num_get/3.cc
new file mode 100644
index 0000000..4399d68
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_get/3.cc
@@ -0,0 +1,41 @@
+// 2005-04-29 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 Free Software Foundation
+//
+// 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.
+
+// 22.2.2.1 Template class num_get
+
+// { dg-do compile }
+
+#include <locale>
+#include <testsuite_character.h>
+
+class gnu_num_get: public std::num_get<__gnu_test::pod_uint>
+{ };
+
+// libstdc++/21238
+void test01()
+{
+ gnu_num_get facet01;
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/22_locale/num_put/3.cc b/libstdc++-v3/testsuite/22_locale/num_put/3.cc
new file mode 100644
index 0000000..799294e
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_put/3.cc
@@ -0,0 +1,41 @@
+// 2005-04-29 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2005 Free Software Foundation
+//
+// 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.
+
+// 22.2.2.2 Template class num_put
+
+// { dg-do compile }
+
+#include <locale>
+#include <testsuite_character.h>
+
+class gnu_num_put: public std::num_put<__gnu_test::pod_uint>
+{ };
+
+// libstdc++/21238
+void test01()
+{
+ gnu_num_put facet01;
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/testsuite_character.cc b/libstdc++-v3/testsuite/testsuite_character.cc
index b5bd412..75a7688 100644
--- a/libstdc++-v3/testsuite/testsuite_character.cc
+++ b/libstdc++-v3/testsuite/testsuite_character.cc
@@ -39,6 +39,12 @@ namespace std
locale::id
ctype<__gnu_test::pod_uchar>::id;
+ locale::id
+ numpunct<__gnu_test::pod_uint>::id;
+
+ locale::id
+ moneypunct<__gnu_test::pod_uint>::id;
+
// 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.
diff --git a/libstdc++-v3/testsuite/testsuite_character.h b/libstdc++-v3/testsuite/testsuite_character.h
index 2e1e433..c4817d5 100644
--- a/libstdc++-v3/testsuite/testsuite_character.h
+++ b/libstdc++-v3/testsuite/testsuite_character.h
@@ -71,6 +71,7 @@ namespace __gnu_test
typedef character<unsigned char, pod_int, pod_state> pod_char;
typedef character<unsigned char, unsigned int, pod_state> pod_uchar;
typedef character<unsigned short, unsigned int> pod_ushort;
+ typedef character<unsigned int, unsigned long> pod_uint;
// Specializations.
// pod_char
@@ -377,6 +378,160 @@ namespace std
return high;
}
};
+
+ // numpunct specializations
+ template<>
+ class numpunct<__gnu_test::pod_uint>
+ : public locale::facet
+ {
+ public:
+ typedef __gnu_test::pod_uint char_type;
+ typedef basic_string<char_type> string_type;
+
+ static locale::id id;
+
+ explicit
+ numpunct(size_t refs = 0)
+ : locale::facet(refs)
+ { }
+
+ char_type
+ decimal_point() const
+ { return this->do_decimal_point(); }
+
+ char_type
+ thousands_sep() const
+ { return this->do_thousands_sep(); }
+
+ string
+ grouping() const
+ { return this->do_grouping(); }
+
+ string_type
+ truename() const
+ { return this->do_truename(); }
+
+ string_type
+ falsename() const
+ { return this->do_falsename(); }
+
+ protected:
+ ~numpunct()
+ { }
+
+ virtual char_type
+ do_decimal_point() const
+ { return char_type(); }
+
+ virtual char_type
+ do_thousands_sep() const
+ { return char_type(); }
+
+ virtual string
+ do_grouping() const
+ { return string(); }
+
+ virtual string_type
+ do_truename() const
+ { return string_type(); }
+
+ virtual string_type
+ do_falsename() const
+ { return string_type(); }
+ };
+
+ template<>
+ class moneypunct<__gnu_test::pod_uint>
+ : public locale::facet, public money_base
+ {
+ public:
+ typedef __gnu_test::pod_uint char_type;
+ typedef basic_string<char_type> string_type;
+
+ static locale::id id;
+ static const bool intl = false;
+
+ explicit
+ moneypunct(size_t refs = 0)
+ : locale::facet(refs)
+ { }
+
+ char_type
+ decimal_point() const
+ { return this->do_decimal_point(); }
+
+ char_type
+ thousands_sep() const
+ { return this->do_thousands_sep(); }
+
+ string
+ grouping() const
+ { return this->do_grouping(); }
+
+ string_type
+ curr_symbol() const
+ { return this->do_curr_symbol(); }
+
+ string_type
+ positive_sign() const
+ { return this->do_positive_sign(); }
+
+ string_type
+ negative_sign() const
+ { return this->do_negative_sign(); }
+
+ int
+ frac_digits() const
+ { return this->do_frac_digits(); }
+
+ pattern
+ pos_format() const
+ { return this->do_pos_format(); }
+
+ pattern
+ neg_format() const
+ { return this->do_neg_format(); }
+
+ protected:
+ ~moneypunct()
+ { }
+
+ virtual char_type
+ do_decimal_point() const
+ { return char_type(); }
+
+ virtual char_type
+ do_thousands_sep() const
+ { return char_type(); }
+
+ virtual string
+ do_grouping() const
+ { return string(); }
+
+ virtual string_type
+ do_curr_symbol() const
+ { return string_type(); }
+
+ string_type
+ do_positive_sign() const
+ { return string_type(); }
+
+ string_type
+ do_negative_sign() const
+ { return string_type(); }
+
+ int
+ do_frac_digits() const
+ { return 0; }
+
+ pattern
+ do_pos_format() const
+ { return pattern(); }
+
+ pattern
+ do_neg_format() const
+ { return pattern(); }
+ };
} // namespace std
#endif // _GLIBCXX_TESTSUITE_CHARACTER_H