mirror of git://gcc.gnu.org/git/gcc.git
locale_conv.h (wstring_convert::_M_conv): Handle noconv result.
* include/bits/locale_conv.h (wstring_convert::_M_conv): Handle noconv result. * testsuite/22_locale/conversions/string/2.cc: Also test UTF-8. * testsuite/22_locale/conversions/string/3.cc: Likewise, and UTF-16. From-SVN: r221212
This commit is contained in:
parent
bcda57c130
commit
9933260f2f
|
|
@ -1,3 +1,10 @@
|
||||||
|
2015-03-05 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
* include/bits/locale_conv.h (wstring_convert::_M_conv): Handle
|
||||||
|
noconv result.
|
||||||
|
* testsuite/22_locale/conversions/string/2.cc: Also test UTF-8.
|
||||||
|
* testsuite/22_locale/conversions/string/3.cc: Likewise, and UTF-16.
|
||||||
|
|
||||||
2015-03-04 Jonathan Wakely <jwakely@redhat.com>
|
2015-03-04 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
PR libstdc++/64797
|
PR libstdc++/64797
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
while (__result == codecvt_base::partial && __next != __last
|
while (__result == codecvt_base::partial && __next != __last
|
||||||
&& (__outstr.size() - __outchars) < __maxlen);
|
&& (__outstr.size() - __outchars) < __maxlen);
|
||||||
|
|
||||||
|
if (__result == codecvt_base::noconv)
|
||||||
|
{
|
||||||
|
__outstr.assign(__first, __last);
|
||||||
|
_M_count = __outstr.size();
|
||||||
|
return __outstr;
|
||||||
|
}
|
||||||
|
|
||||||
__outstr.resize(__outchars);
|
__outstr.resize(__outchars);
|
||||||
_M_count = __next - __first;
|
_M_count = __next - __first;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,24 @@ using std::u32string;
|
||||||
// test conversion errors, with and without error strings
|
// test conversion errors, with and without error strings
|
||||||
|
|
||||||
void test01()
|
void test01()
|
||||||
|
{
|
||||||
|
typedef str_conv<char> sc;
|
||||||
|
|
||||||
|
const sc::byte_string berr = "invalid wide string";
|
||||||
|
const sc::wide_string werr = u8"invalid byte string";
|
||||||
|
|
||||||
|
sc c(berr, werr);
|
||||||
|
string input = "Stop";
|
||||||
|
input += char(0xFF);
|
||||||
|
string woutput = c.from_bytes(input);
|
||||||
|
VERIFY( input == woutput ); // noconv case doesn't detect invalid input
|
||||||
|
string winput = u8"Stop";
|
||||||
|
winput += char(0xFF);
|
||||||
|
string output = c.to_bytes(winput);
|
||||||
|
VERIFY( winput == output ); // noconv case doesn't detect invalid input
|
||||||
|
}
|
||||||
|
|
||||||
|
void test02()
|
||||||
{
|
{
|
||||||
typedef str_conv<char16_t> sc;
|
typedef str_conv<char16_t> sc;
|
||||||
|
|
||||||
|
|
@ -53,7 +71,7 @@ void test01()
|
||||||
VERIFY( berr == output );
|
VERIFY( berr == output );
|
||||||
}
|
}
|
||||||
|
|
||||||
void test02()
|
void test03()
|
||||||
{
|
{
|
||||||
typedef str_conv<char32_t> sc;
|
typedef str_conv<char32_t> sc;
|
||||||
|
|
||||||
|
|
@ -75,4 +93,5 @@ int main()
|
||||||
{
|
{
|
||||||
test01();
|
test01();
|
||||||
test02();
|
test02();
|
||||||
|
test03();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,54 @@ template<typename Elem>
|
||||||
using str_conv = std::wstring_convert<cvt<Elem>, Elem>;
|
using str_conv = std::wstring_convert<cvt<Elem>, Elem>;
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
using std::u16string;
|
||||||
using std::u32string;
|
using std::u32string;
|
||||||
|
|
||||||
// test construction with state, for partial conversions
|
// test construction with state, for partial conversions
|
||||||
|
|
||||||
void test01()
|
void test01()
|
||||||
|
{
|
||||||
|
typedef str_conv<char> wsc;
|
||||||
|
|
||||||
|
wsc c;
|
||||||
|
string input = u8"\u00a3 shillings pence";
|
||||||
|
string woutput = c.from_bytes(input.substr(0, 1));
|
||||||
|
auto partial_state = c.state();
|
||||||
|
auto partial_count = c.converted();
|
||||||
|
|
||||||
|
auto woutput2 = c.from_bytes(u8"state reset on next conversion");
|
||||||
|
VERIFY( woutput2 == u8"state reset on next conversion" );
|
||||||
|
|
||||||
|
wsc c2(new cvt<char>, partial_state);
|
||||||
|
woutput += c2.from_bytes(input.substr(partial_count));
|
||||||
|
VERIFY( u8"\u00a3 shillings pence" == woutput );
|
||||||
|
|
||||||
|
string roundtrip = c2.to_bytes(woutput);
|
||||||
|
VERIFY( input == roundtrip );
|
||||||
|
}
|
||||||
|
|
||||||
|
void test02()
|
||||||
|
{
|
||||||
|
typedef str_conv<char16_t> wsc;
|
||||||
|
|
||||||
|
wsc c;
|
||||||
|
string input = u8"\u00a3 shillings pence";
|
||||||
|
u16string woutput = c.from_bytes(input.substr(0, 1));
|
||||||
|
auto partial_state = c.state();
|
||||||
|
auto partial_count = c.converted();
|
||||||
|
|
||||||
|
auto woutput2 = c.from_bytes(u8"state reset on next conversion");
|
||||||
|
VERIFY( woutput2 == u"state reset on next conversion" );
|
||||||
|
|
||||||
|
wsc c2(new cvt<char16_t>, partial_state);
|
||||||
|
woutput += c2.from_bytes(input.substr(partial_count));
|
||||||
|
VERIFY( u"\u00a3 shillings pence" == woutput );
|
||||||
|
|
||||||
|
string roundtrip = c2.to_bytes(woutput);
|
||||||
|
VERIFY( input == roundtrip );
|
||||||
|
}
|
||||||
|
|
||||||
|
void test03()
|
||||||
{
|
{
|
||||||
typedef str_conv<char32_t> wsc;
|
typedef str_conv<char32_t> wsc;
|
||||||
|
|
||||||
|
|
@ -44,7 +87,7 @@ void test01()
|
||||||
auto partial_state = c.state();
|
auto partial_state = c.state();
|
||||||
auto partial_count = c.converted();
|
auto partial_count = c.converted();
|
||||||
|
|
||||||
auto woutput2 = c.from_bytes("state reset on next conversion");
|
auto woutput2 = c.from_bytes(u8"state reset on next conversion");
|
||||||
VERIFY( woutput2 == U"state reset on next conversion" );
|
VERIFY( woutput2 == U"state reset on next conversion" );
|
||||||
|
|
||||||
wsc c2(new cvt<char32_t>, partial_state);
|
wsc c2(new cvt<char32_t>, partial_state);
|
||||||
|
|
@ -55,7 +98,10 @@ void test01()
|
||||||
VERIFY( input == roundtrip );
|
VERIFY( input == roundtrip );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test01();
|
test01();
|
||||||
|
test02();
|
||||||
|
test03();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue