summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-29 11:48:53 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-29 11:48:53 +0000
commitfbaa96d67e32888ce7e08e8647cdb4fa7cfc13e2 (patch)
tree2b6cb424d6ec5f62b07742a58556da2ccfca63d2
parent66575a0b4994fa8b8c75366ccfdca82145d052ea (diff)
downloadgcc-fbaa96d67e32888ce7e08e8647cdb4fa7cfc13e2.tar.gz
2005-06-29 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/22131 * include/bits/locale_facets.tcc (num_get<>::_M_extract_int, num_get<>::_M_extract_float, money_get<>::_M_extract): Adjust to assign the result also when digit grouping is wrong (but the grammar is correct), as per 22.2.2.1.2, p11-12 (NB: consistently for money_get too). * config/locale/generic/c_locale.cc (__convert_from_v): Do not check ios_base::failbit at the outset. * config/locale/gnu/c_locale.cc: Likewise. * testsuite/22_locale/money_get/get/char/22131.cc: New. * testsuite/22_locale/money_get/get/wchar_t/22131.cc: Likewise. * testsuite/22_locale/num_get/get/char/22131.cc: Likewise. * testsuite/22_locale/num_get/get/wchar_t/22131.cc: Likewise. * testsuite/22_locale/num_get/get/char/12.cc: Adjust. * testsuite/22_locale/num_get/get/wchar_t/12.cc: Likewise. * testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc: Likewise. * testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101416 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog22
-rw-r--r--libstdc++-v3/config/locale/generic/c_locale.cc117
-rw-r--r--libstdc++-v3/config/locale/gnu/c_locale.cc54
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc58
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get/get/char/22131.cc83
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/22131.cc83
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_get/get/char/12.cc14
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_get/get/char/22131.cc126
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/12.cc15
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/22131.cc126
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc10
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc11
12 files changed, 577 insertions, 142 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c46431fbdd3..e0510128968 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,25 @@
+2005-06-29 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/22131
+ * include/bits/locale_facets.tcc (num_get<>::_M_extract_int,
+ num_get<>::_M_extract_float, money_get<>::_M_extract):
+ Adjust to assign the result also when digit grouping is
+ wrong (but the grammar is correct), as per 22.2.2.1.2, p11-12
+ (NB: consistently for money_get too).
+ * config/locale/generic/c_locale.cc (__convert_from_v): Do
+ not check ios_base::failbit at the outset.
+ * config/locale/gnu/c_locale.cc: Likewise.
+ * testsuite/22_locale/money_get/get/char/22131.cc: New.
+ * testsuite/22_locale/money_get/get/wchar_t/22131.cc: Likewise.
+ * testsuite/22_locale/num_get/get/char/22131.cc: Likewise.
+ * testsuite/22_locale/num_get/get/wchar_t/22131.cc: Likewise.
+ * testsuite/22_locale/num_get/get/char/12.cc: Adjust.
+ * testsuite/22_locale/num_get/get/wchar_t/12.cc: Likewise.
+ * testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc:
+ Likewise.
+ * testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc:
+ Likewise.
+
2005-06-28 Paul Brook <paul@codesourcery.com>
* acinclude.m4 (GLIBCXX_ENABLE_SJLJ_EXCEPTIONS): Check for
diff --git a/libstdc++-v3/config/locale/generic/c_locale.cc b/libstdc++-v3/config/locale/generic/c_locale.cc
index 4a940ee8e5b..eee8e067cd3 100644
--- a/libstdc++-v3/config/locale/generic/c_locale.cc
+++ b/libstdc++-v3/config/locale/generic/c_locale.cc
@@ -1,6 +1,7 @@
// Wrapper for underlying C-language localization -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005
+// 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
@@ -50,39 +51,36 @@ namespace std
__convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
const __c_locale&)
{
- if (!(__err & ios_base::failbit))
- {
- // Assumes __s formatted for "C" locale.
- char* __old = strdup(setlocale(LC_ALL, NULL));
- setlocale(LC_ALL, "C");
- char* __sanity;
- errno = 0;
+ // Assumes __s formatted for "C" locale.
+ errno = 0;
+ char* __old = strdup(setlocale(LC_ALL, NULL));
+ setlocale(LC_ALL, "C");
+ char* __sanity;
#if defined(_GLIBCXX_HAVE_STRTOF)
- float __f = strtof(__s, &__sanity);
+ float __f = strtof(__s, &__sanity);
#else
- double __d = strtod(__s, &__sanity);
- float __f = static_cast<float>(__d);
+ double __d = strtod(__s, &__sanity);
+ float __f = static_cast<float>(__d);
#ifdef _GLIBCXX_HAVE_FINITEF
- if (!finitef (__f))
- errno = ERANGE;
+ if (!finitef (__f))
+ errno = ERANGE;
#elif defined (_GLIBCXX_HAVE_FINITE)
- if (!finite (static_cast<double> (__f)))
- errno = ERANGE;
+ if (!finite (static_cast<double> (__f)))
+ errno = ERANGE;
#elif defined (_GLIBCXX_HAVE_ISINF)
- if (isinf (static_cast<double> (__f)))
- errno = ERANGE;
+ if (isinf (static_cast<double> (__f)))
+ errno = ERANGE;
#else
- if (fabs(__d) > numeric_limits<float>::max())
- errno = ERANGE;
+ if (fabs(__d) > numeric_limits<float>::max())
+ errno = ERANGE;
#endif
#endif
- if (__sanity != __s && errno != ERANGE)
- __v = __f;
- else
- __err |= ios_base::failbit;
- setlocale(LC_ALL, __old);
- free(__old);
- }
+ if (__sanity != __s && errno != ERANGE)
+ __v = __f;
+ else
+ __err |= ios_base::failbit;
+ setlocale(LC_ALL, __old);
+ free(__old);
}
template<>
@@ -90,21 +88,18 @@ namespace std
__convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
const __c_locale&)
{
- if (!(__err & ios_base::failbit))
- {
- // Assumes __s formatted for "C" locale.
- char* __old = strdup(setlocale(LC_ALL, NULL));
- setlocale(LC_ALL, "C");
- char* __sanity;
- errno = 0;
- double __d = strtod(__s, &__sanity);
- if (__sanity != __s && errno != ERANGE)
- __v = __d;
- else
- __err |= ios_base::failbit;
- setlocale(LC_ALL, __old);
- free(__old);
- }
+ // Assumes __s formatted for "C" locale.
+ errno = 0;
+ char* __old = strdup(setlocale(LC_ALL, NULL));
+ setlocale(LC_ALL, "C");
+ char* __sanity;
+ double __d = strtod(__s, &__sanity);
+ if (__sanity != __s && errno != ERANGE)
+ __v = __d;
+ else
+ __err |= ios_base::failbit;
+ setlocale(LC_ALL, __old);
+ free(__old);
}
template<>
@@ -112,31 +107,27 @@ namespace std
__convert_to_v(const char* __s, long double& __v,
ios_base::iostate& __err, const __c_locale&)
{
- if (!(__err & ios_base::failbit))
- {
- // Assumes __s formatted for "C" locale.
- char* __old = strdup(setlocale(LC_ALL, NULL));
- setlocale(LC_ALL, "C");
+ // Assumes __s formatted for "C" locale.
+ errno = 0;
+ char* __old = strdup(setlocale(LC_ALL, NULL));
+ setlocale(LC_ALL, "C");
#if defined(_GLIBCXX_HAVE_STRTOLD)
- char* __sanity;
- errno = 0;
- long double __ld = strtold(__s, &__sanity);
- if (__sanity != __s && errno != ERANGE)
- __v = __ld;
+ char* __sanity;
+ long double __ld = strtold(__s, &__sanity);
+ if (__sanity != __s && errno != ERANGE)
+ __v = __ld;
#else
- typedef char_traits<char>::int_type int_type;
- long double __ld;
- errno = 0;
- int __p = sscanf(__s, "%Lf", &__ld);
- if (__p && static_cast<int_type>(__p) != char_traits<char>::eof()
- && errno != ERANGE)
- __v = __ld;
+ typedef char_traits<char>::int_type int_type;
+ long double __ld;
+ int __p = sscanf(__s, "%Lf", &__ld);
+ if (__p && static_cast<int_type>(__p) != char_traits<char>::eof()
+ && errno != ERANGE)
+ __v = __ld;
#endif
- else
- __err |= ios_base::failbit;
- setlocale(LC_ALL, __old);
- free(__old);
- }
+ else
+ __err |= ios_base::failbit;
+ setlocale(LC_ALL, __old);
+ free(__old);
}
void
diff --git a/libstdc++-v3/config/locale/gnu/c_locale.cc b/libstdc++-v3/config/locale/gnu/c_locale.cc
index bf975b98bac..c83aa56f6ea 100644
--- a/libstdc++-v3/config/locale/gnu/c_locale.cc
+++ b/libstdc++-v3/config/locale/gnu/c_locale.cc
@@ -1,6 +1,7 @@
// Wrapper for underlying C-language localization -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005
+// 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
@@ -46,16 +47,13 @@ namespace std
__convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
const __c_locale& __cloc)
{
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- float __f = __strtof_l(__s, &__sanity, __cloc);
- if (__sanity != __s && errno != ERANGE)
- __v = __f;
- else
- __err |= ios_base::failbit;
- }
+ char* __sanity;
+ errno = 0;
+ float __f = __strtof_l(__s, &__sanity, __cloc);
+ if (__sanity != __s && errno != ERANGE)
+ __v = __f;
+ else
+ __err |= ios_base::failbit;
}
template<>
@@ -63,16 +61,13 @@ namespace std
__convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
const __c_locale& __cloc)
{
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- double __d = __strtod_l(__s, &__sanity, __cloc);
- if (__sanity != __s && errno != ERANGE)
- __v = __d;
- else
- __err |= ios_base::failbit;
- }
+ char* __sanity;
+ errno = 0;
+ double __d = __strtod_l(__s, &__sanity, __cloc);
+ if (__sanity != __s && errno != ERANGE)
+ __v = __d;
+ else
+ __err |= ios_base::failbit;
}
template<>
@@ -80,16 +75,13 @@ namespace std
__convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
const __c_locale& __cloc)
{
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long double __ld = __strtold_l(__s, &__sanity, __cloc);
- if (__sanity != __s && errno != ERANGE)
- __v = __ld;
- else
- __err |= ios_base::failbit;
- }
+ char* __sanity;
+ errno = 0;
+ long double __ld = __strtold_l(__s, &__sanity, __cloc);
+ if (__sanity != __s && errno != ERANGE)
+ __v = __ld;
+ else
+ __err |= ios_base::failbit;
}
void
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index ff54c93ed93..7987e678ebb 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -306,6 +306,7 @@ namespace std
// Next, look for leading zeros.
bool __found_mantissa = false;
+ int __sep_pos = 0;
while (!__testeof)
{
if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep
@@ -318,6 +319,8 @@ namespace std
__xtrc += '0';
__found_mantissa = true;
}
+ ++__sep_pos;
+
if (++__beg != __end)
__c = *__beg;
else
@@ -333,7 +336,6 @@ namespace std
string __found_grouping;
if (__lc->_M_use_grouping)
__found_grouping.reserve(32);
- int __sep_pos = 0;
const char_type* __q;
const char_type* __lit_zero = __lit + __num_base::_S_izero;
while (!__testeof)
@@ -353,7 +355,9 @@ namespace std
}
else
{
- __err |= ios_base::failbit;
+ // NB: __convert_to_v will not assign __v and will
+ // set the failbit.
+ __xtrc.clear();
break;
}
}
@@ -383,7 +387,7 @@ namespace std
}
else if ((__c == __lit[__num_base::_S_ie]
|| __c == __lit[__num_base::_S_iE])
- && __found_mantissa && !__found_sci)
+ && !__found_sci && __found_mantissa)
{
// Scientific notation.
if (__found_grouping.size() && !__found_dec)
@@ -500,6 +504,7 @@ namespace std
// Next, look for leading zeros and check required digits
// for base formats.
bool __found_zero = false;
+ int __sep_pos = 0;
while (!__testeof)
{
if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep
@@ -507,25 +512,27 @@ namespace std
break;
else if (__c == __lit[__num_base::_S_izero]
&& (!__found_zero || __base == 10))
- __found_zero = true;
- else if (__found_zero)
{
- if (__c == __lit[__num_base::_S_ix]
- || __c == __lit[__num_base::_S_iX])
+ __found_zero = true;
+ ++__sep_pos;
+ if (__basefield == 0)
+ __base = 8;
+ if (__base == 8)
+ __sep_pos = 0;
+ }
+ else if (__found_zero
+ && (__c == __lit[__num_base::_S_ix]
+ || __c == __lit[__num_base::_S_iX]))
+ {
+ if (__basefield == 0)
+ __base = 16;
+ if (__base == 16)
{
- if (__basefield == 0)
- __base = 16;
- if (__base == 16)
- __found_zero = false;
- else
- break;
+ __found_zero = false;
+ __sep_pos = 0;
}
else
- {
- if (__basefield == 0)
- __base = 8;
- break;
- }
+ break;
}
else
break;
@@ -549,8 +556,7 @@ namespace std
string __found_grouping;
if (__lc->_M_use_grouping)
__found_grouping.reserve(32);
- int __sep_pos = 0;
- bool __overflow = false;
+ bool __testfail = false;
const __unsigned_type __max = __negative ?
-numeric_limits<_ValueT>::min() : numeric_limits<_ValueT>::max();
const __unsigned_type __smax = __max / __base;
@@ -572,7 +578,7 @@ namespace std
}
else
{
- __err |= ios_base::failbit;
+ __testfail = true;
break;
}
}
@@ -584,11 +590,11 @@ namespace std
if (__digit > 15)
__digit -= 6;
if (__result > __smax)
- __overflow = true;
+ __testfail = true;
else
{
__result *= __base;
- __overflow |= __result > __max - __digit;
+ __testfail |= __result > __max - __digit;
__result += __digit;
++__sep_pos;
}
@@ -616,8 +622,8 @@ namespace std
__err |= ios_base::failbit;
}
- if (!(__err & ios_base::failbit) && !__overflow
- && (__sep_pos || __found_zero || __found_grouping.size()))
+ if (!__testfail && (__sep_pos || __found_zero
+ || __found_grouping.size()))
__v = __negative ? -__result : __result;
else
__err |= ios_base::failbit;
@@ -1444,7 +1450,7 @@ namespace std
if (!std::__verify_grouping(__lc->_M_grouping,
__lc->_M_grouping_size,
__grouping_tmp))
- __testvalid = false;
+ __err |= ios_base::failbit;
}
// Iff not enough digits were supplied after the decimal-point.
diff --git a/libstdc++-v3/testsuite/22_locale/money_get/get/char/22131.cc b/libstdc++-v3/testsuite/22_locale/money_get/get/char/22131.cc
new file mode 100644
index 00000000000..2bcf42aa4d3
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/money_get/get/char/22131.cc
@@ -0,0 +1,83 @@
+// 2005-06-28 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.1 money_get members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+struct My_money_io : public std::moneypunct<char, false>
+{
+ std::string do_grouping() const { return "\1"; }
+ char_type do_thousands_sep() const { return '#'; }
+
+ pattern do_neg_format() const
+ {
+ pattern pat = { { symbol, none, sign, value } };
+ return pat;
+ }
+};
+
+// libstdc++/22131
+void test01()
+{
+ using namespace std;
+ typedef istreambuf_iterator<char> InIt;
+
+ bool test __attribute__((unused)) = true;
+
+ locale loc(locale::classic(), new My_money_io);
+
+ string buffer1("00#0#1");
+ string buffer2("000##1");
+
+ bool intl = false;
+
+ InIt iend1, iend2;
+ ios_base::iostate err1, err2;
+ string val1, val2;
+
+ const money_get<char,InIt>& mg =
+ use_facet<money_get<char, InIt> >(loc);
+
+ istringstream fmt1(buffer1);
+ fmt1.imbue(loc);
+ InIt ibeg1(fmt1);
+ err1 = ios_base::goodbit;
+ mg.get(ibeg1, iend1, intl, fmt1, err1, val1);
+ VERIFY( err1 == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( val1 == "1" );
+
+ istringstream fmt2(buffer2);
+ fmt2.imbue(loc);
+ InIt ibeg2(fmt2);
+ err2 = ios_base::goodbit;
+ mg.get(ibeg2, iend2, intl, fmt2, err2, val2);
+ VERIFY( err2 == ios_base::failbit );
+ VERIFY( *ibeg2 == '#' );
+ VERIFY( val2 == "" );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/22131.cc b/libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/22131.cc
new file mode 100644
index 00000000000..a3faaf89484
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/22131.cc
@@ -0,0 +1,83 @@
+// 2005-06-28 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.1 money_get members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+struct My_money_io : public std::moneypunct<wchar_t, false>
+{
+ std::string do_grouping() const { return "\1"; }
+ char_type do_thousands_sep() const { return L'#'; }
+
+ pattern do_neg_format() const
+ {
+ pattern pat = { { symbol, none, sign, value } };
+ return pat;
+ }
+};
+
+// libstdc++/22131
+void test01()
+{
+ using namespace std;
+ typedef istreambuf_iterator<wchar_t> InIt;
+
+ bool test __attribute__((unused)) = true;
+
+ locale loc(locale::classic(), new My_money_io);
+
+ wstring buffer1(L"00#0#1");
+ wstring buffer2(L"000##1");
+
+ bool intl = false;
+
+ InIt iend1, iend2;
+ ios_base::iostate err1, err2;
+ wstring val1, val2;
+
+ const money_get<wchar_t,InIt>& mg =
+ use_facet<money_get<wchar_t, InIt> >(loc);
+
+ wistringstream fmt1(buffer1);
+ fmt1.imbue(loc);
+ InIt ibeg1(fmt1);
+ err1 = ios_base::goodbit;
+ mg.get(ibeg1, iend1, intl, fmt1, err1, val1);
+ VERIFY( err1 == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( val1 == L"1" );
+
+ wistringstream fmt2(buffer2);
+ fmt2.imbue(loc);
+ InIt ibeg2(fmt2);
+ err2 = ios_base::goodbit;
+ mg.get(ibeg2, iend2, intl, fmt2, err2, val2);
+ VERIFY( err2 == ios_base::failbit );
+ VERIFY( *ibeg2 == L'#' );
+ VERIFY( val2 == L"" );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/22_locale/num_get/get/char/12.cc b/libstdc++-v3/testsuite/22_locale/num_get/get/char/12.cc
index 75a8f4f3314..93300d428d2 100644
--- a/libstdc++-v3/testsuite/22_locale/num_get/get/char/12.cc
+++ b/libstdc++-v3/testsuite/22_locale/num_get/get/char/12.cc
@@ -1,6 +1,6 @@
// 2003-12-22 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2003 Free Software Foundation
+// Copyright (C) 2003, 2004, 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
@@ -60,8 +60,9 @@ void test01()
long l3 = 1l;
long l4 = 63l;
double d = 0.0;
- double d1 = .4;
- double d2 = .1;
+ double d1 = .4;
+ double d2 = 0.0;
+ double d3 = .1;
iss1.str("+3");
err = ios_base::goodbit;
@@ -128,6 +129,7 @@ void test01()
end = ng2.get(iss2.rdbuf(), 0, iss2, err, l);
VERIFY( err == ios_base::failbit );
VERIFY( *end == 'X' );
+ VERIFY( l == l3 );
iss2.str("000778");
iss2.clear();
@@ -141,15 +143,15 @@ void test01()
iss2.clear();
err = ios_base::goodbit;
end = ng2.get(iss2.rdbuf(), 0, iss2, err, d);
- VERIFY( err == ios_base::failbit );
- VERIFY( *end == 'X' );
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( d == d2 );
iss2.str("-1");
iss2.clear();
err = ios_base::goodbit;
end = ng2.get(iss2.rdbuf(), 0, iss2, err, d);
VERIFY( err == ios_base::eofbit );
- VERIFY( d == d2 );
+ VERIFY( d == d3 );
}
diff --git a/libstdc++-v3/testsuite/22_locale/num_get/get/char/22131.cc b/libstdc++-v3/testsuite/22_locale/num_get/get/char/22131.cc
new file mode 100644
index 00000000000..47e63782997
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_get/get/char/22131.cc
@@ -0,0 +1,126 @@
+// 2005-06-28 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.1 num_get members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+struct Punct: std::numpunct<char>
+{
+ std::string do_grouping() const { return "\1"; }
+ char do_thousands_sep() const { return '#'; }
+};
+
+// libstdc++/22131
+void test01()
+{
+ using namespace std;
+ typedef istreambuf_iterator<char> iterator_type;
+
+ bool test __attribute__((unused)) = true;
+
+ istringstream iss1, iss2;
+ iss1.imbue(locale(iss1.getloc(), new Punct));
+ const num_get<char>& ng1 = use_facet<num_get<char> >(iss1.getloc());
+
+ ios_base::iostate err = ios_base::goodbit;
+ iterator_type end;
+ long l = 0l;
+ long l1 = 1l;
+ long l2 = 2l;
+ long l3 = 3l;
+ double d = 0.0;
+ double d1 = 1.0;
+ double d2 = 2.0;
+
+ iss1.str("00#0#1");
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( l == l1 );
+
+ iss1.str("000##2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::failbit );
+ VERIFY( *end == '#' );
+ VERIFY( l == l1 );
+
+ iss1.str("0#0#0#2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::eofbit );
+ VERIFY( l == l2 );
+
+ iss1.str("00#0#1");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, d);
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( d == d1 );
+
+ iss1.str("000##2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, d);
+ VERIFY( err == ios_base::failbit );
+ VERIFY( *end == '#' );
+ VERIFY( d == d1 );
+
+ iss1.str("0#0#0#2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, d);
+ VERIFY( err == ios_base::eofbit );
+ VERIFY( d == d2 );
+
+ iss1.str("0#0");
+ iss1.clear();
+ iss1.unsetf(ios::basefield);
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::failbit );
+ VERIFY( *end == '#' );
+ VERIFY( l == l2 );
+
+ iss1.str("00#0#3");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::eofbit );
+ VERIFY( l == l3 );
+
+ iss1.str("00#02");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( l == l2 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/12.cc b/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/12.cc
index e87e7ba3677..63c38530ab8 100644
--- a/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/12.cc
+++ b/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/12.cc
@@ -1,6 +1,6 @@
// 2003-12-22 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2003 Free Software Foundation
+// Copyright (C) 2003, 2004, 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
@@ -60,8 +60,9 @@ void test01()
long l3 = 1l;
long l4 = 63l;
double d = 0.0;
- double d1 = .4;
- double d2 = .1;
+ double d1 = .4;
+ double d2 = 0.0;
+ double d3 = .1;
iss1.str(L"+3");
err = ios_base::goodbit;
@@ -128,6 +129,7 @@ void test01()
end = ng2.get(iss2.rdbuf(), 0, iss2, err, l);
VERIFY( err == ios_base::failbit );
VERIFY( *end == L'X' );
+ VERIFY( l == l3 );
iss2.str(L"000778");
iss2.clear();
@@ -141,18 +143,17 @@ void test01()
iss2.clear();
err = ios_base::goodbit;
end = ng2.get(iss2.rdbuf(), 0, iss2, err, d);
- VERIFY( err == ios_base::failbit );
- VERIFY( *end == L'X' );
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( d == d2 );
iss2.str(L"-1");
iss2.clear();
err = ios_base::goodbit;
end = ng2.get(iss2.rdbuf(), 0, iss2, err, d);
VERIFY( err == ios_base::eofbit );
- VERIFY( d == d2 );
+ VERIFY( d == d3 );
}
-
int main()
{
test01();
diff --git a/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/22131.cc b/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/22131.cc
new file mode 100644
index 00000000000..de7cf714544
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/22131.cc
@@ -0,0 +1,126 @@
+// 2005-06-28 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.1 num_get members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+struct Punct: std::numpunct<wchar_t>
+{
+ std::string do_grouping() const { return "\1"; }
+ wchar_t do_thousands_sep() const { return L'#'; }
+};
+
+// libstdc++/22131
+void test01()
+{
+ using namespace std;
+ typedef istreambuf_iterator<wchar_t> iterator_type;
+
+ bool test __attribute__((unused)) = true;
+
+ wistringstream iss1, iss2;
+ iss1.imbue(locale(iss1.getloc(), new Punct));
+ const num_get<wchar_t>& ng1 = use_facet<num_get<wchar_t> >(iss1.getloc());
+
+ ios_base::iostate err = ios_base::goodbit;
+ iterator_type end;
+ long l = 0l;
+ long l1 = 1l;
+ long l2 = 2l;
+ long l3 = 3l;
+ double d = 0.0;
+ double d1 = 1.0;
+ double d2 = 2.0;
+
+ iss1.str(L"00#0#1");
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( l == l1 );
+
+ iss1.str(L"000##2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::failbit );
+ VERIFY( *end == L'#' );
+ VERIFY( l == l1 );
+
+ iss1.str(L"0#0#0#2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::eofbit );
+ VERIFY( l == l2 );
+
+ iss1.str(L"00#0#1");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, d);
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( d == d1 );
+
+ iss1.str(L"000##2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, d);
+ VERIFY( err == ios_base::failbit );
+ VERIFY( *end == L'#' );
+ VERIFY( d == d1 );
+
+ iss1.str(L"0#0#0#2");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, d);
+ VERIFY( err == ios_base::eofbit );
+ VERIFY( d == d2 );
+
+ iss1.str(L"0#0");
+ iss1.clear();
+ iss1.unsetf(ios::basefield);
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::failbit );
+ VERIFY( *end == L'#' );
+ VERIFY( l == l2 );
+
+ iss1.str(L"00#0#3");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == ios_base::eofbit );
+ VERIFY( l == l3 );
+
+ iss1.str(L"00#02");
+ iss1.clear();
+ err = ios_base::goodbit;
+ end = ng1.get(iss1.rdbuf(), 0, iss1, err, l);
+ VERIFY( err == (ios_base::eofbit | ios_base::failbit) );
+ VERIFY( l == l2 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc
index f958be49bae..ed5940b3cb5 100644
--- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/07.cc
@@ -1,6 +1,7 @@
// 1999-04-12 bkoz
-// Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005
+// 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
@@ -62,7 +63,7 @@ void test07()
is.clear();
is >> h2;
- VERIFY( h2 == 0 );
+ VERIFY( h2 == 1232224 );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::eofbit) );
@@ -124,8 +125,9 @@ void test07()
VERIFY( is.good() );
is >> h2;
- VERIFY( h2 == 0 );
+ VERIFY( h2 == 1000000 );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
+ h2 = 0;
is.clear();
is >> h2;
@@ -134,7 +136,7 @@ void test07()
h2 = 0;
is >> h2;
- VERIFY( h2 == 0 );
+ VERIFY( h2 == 1234567 );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::eofbit) );
is.clear();
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc
index fe7adbd70f5..a18a610dc61 100644
--- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/wchar_t/07.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 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
@@ -59,8 +59,8 @@ void test07()
VERIFY( is.good() );
is.clear();
- is >> h2;
- VERIFY( h2 == 0 );
+ is >> h2;
+ VERIFY( h2 == 1232224 );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::eofbit) );
@@ -122,8 +122,9 @@ void test07()
VERIFY( is.good() );
is >> h2;
- VERIFY( h2 == 0 );
+ VERIFY( h2 == 1000000 );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
+ h2 = 0;
is.clear();
is >> h2;
@@ -132,7 +133,7 @@ void test07()
h2 = 0;
is >> h2;
- VERIFY( h2 == 0 );
+ VERIFY( h2 == 1234567 );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::eofbit) );
is.clear();