Commit 9933260f by Jonathan Wakely Committed by Jonathan Wakely

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
parent bcda57c1
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 ...@@ -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;
......
...@@ -37,6 +37,24 @@ using std::u32string; ...@@ -37,6 +37,24 @@ using std::u32string;
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;
const sc::byte_string berr = "invalid wide string"; const sc::byte_string berr = "invalid wide string";
...@@ -53,7 +71,7 @@ void test01() ...@@ -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() ...@@ -75,4 +93,5 @@ int main()
{ {
test01(); test01();
test02(); test02();
test03();
} }
...@@ -30,12 +30,55 @@ template<typename Elem> ...@@ -30,12 +30,55 @@ 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;
wsc c; wsc c;
...@@ -44,7 +87,7 @@ void test01() ...@@ -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() ...@@ -55,7 +98,10 @@ void test01()
VERIFY( input == roundtrip ); VERIFY( input == roundtrip );
} }
int main() int main()
{ {
test01(); test01();
test02();
test03();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment