2002-03-05 Paolo Carlini <pcarlini@unitus.it>

libstdc++/5816
	* include/bits/locale_facets.tcc
	(num_get::_M_extract_float): Fix the parsing of __dec, since
	the standard prescribes that if no grouping characters are
	seen, no grouping check is applied.
        * testsuite/22_locale/num_get_members_char.cc: Add test05
	distilled from the PR.
        * testsuite/22_locale/num_get_members_wchar_t.cc: Ditto.

From-SVN: r50325
This commit is contained in:
Paolo Carlini 2002-03-05 20:05:07 +01:00 committed by Paolo Carlini
parent 46b0d60ec1
commit 2ebc2e050e
4 changed files with 63 additions and 2 deletions

View File

@ -1,3 +1,14 @@
2002-03-05 Paolo Carlini <pcarlini@unitus.it>
libstdc++/5816
* include/bits/locale_facets.tcc
(num_get::_M_extract_float): Fix the parsing of __dec, since
the standard prescribes that if no grouping characters are
seen, no grouping check is applied.
* testsuite/22_locale/num_get_members_char.cc: Add test05
distilled from the PR.
* testsuite/22_locale/num_get_members_wchar_t.cc: Ditto.
2002-03-04 Craig Rodrigues <rodrigc@gcc.gnu.org>
* docs/html/17_intro/porting-howto.xml: Refer to

View File

@ -174,7 +174,11 @@ namespace std
}
else if (__c == __dec && !__found_dec)
{
__found_grouping += static_cast<char>(__sep_pos);
// According to the standard, if no grouping chars are seen,
// no grouping check is applied. Therefore __found_grouping
// must be adjusted only if __dec comes after some __sep.
if (__found_grouping.size())
__found_grouping += static_cast<char>(__sep_pos);
++__pos;
__xtrc += '.';
__c = *(++__beg);

View File

@ -343,7 +343,7 @@ void test04()
istringstream iss;
// A locale that expects grouping
// A locale that expects grouping
locale loc_de("de_DE");
iss.imbue(loc_de);
@ -390,12 +390,35 @@ void test04()
VERIFY( ul == 0776 );
}
// libstdc++/5816
void test05()
{
using namespace std;
double d = 0.0;
istringstream iss;
locale loc_de("de_DE");
iss.imbue(loc_de);
const num_get<char>& ng = use_facet<num_get<char> >(iss.getloc());
const ios_base::iostate goodbit = ios_base::goodbit;
ios_base::iostate err = ios_base::goodbit;
iss.str("1234,5 ");
err = goodbit;
ng.get(iss.rdbuf(), 0, iss, err, d);
VERIFY( err == goodbit );
VERIFY( d == 1234.5 );
}
int main()
{
test01();
test02();
test03();
test04();
test05();
return 0;
}

View File

@ -391,6 +391,28 @@ void test04()
VERIFY( err == goodbit );
VERIFY( ul == 0776 );
}
// libstdc++/5816
void test05()
{
using namespace std;
double d = 0.0;
wistringstream iss;
locale loc_de("de_DE");
iss.imbue(loc_de);
const num_get<wchar_t>& ng = use_facet<num_get<wchar_t> >(iss.getloc());
const ios_base::iostate goodbit = ios_base::goodbit;
ios_base::iostate err = ios_base::goodbit;
iss.str(L"1234,5 ");
err = goodbit;
ng.get(iss.rdbuf(), 0, iss, err, d);
VERIFY( err == goodbit );
VERIFY( d == 1234.5 );
}
#endif
int main()
@ -400,6 +422,7 @@ int main()
test02();
test03();
test04();
test05();
#endif
return 0;
}