locale_conv.h (wstring_convert::_M_conv): Handle noconv result.
authorJonathan Wakely <jwakely@redhat.com>
Thu, 5 Mar 2015 13:36:21 +0000 (13:36 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 5 Mar 2015 13:36:21 +0000 (13:36 +0000)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_conv.h
libstdc++-v3/testsuite/22_locale/conversions/string/2.cc
libstdc++-v3/testsuite/22_locale/conversions/string/3.cc

index 16760dade1e73e72fc2b4c051a7da00eaa3ed226..ed4edf8b89f6ac4398d3eb21837fc3ceb055e0ce 100644 (file)
@@ -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>
 
        PR libstdc++/64797
index b53754d154153e5683b0f506e448f8b13d5135ef..9b49617b7a94f861bcc2c850ec6a85743b1e0fa6 100644 (file)
@@ -213,6 +213,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          while (__result == codecvt_base::partial && __next != __last
                 && (__outstr.size() - __outchars) < __maxlen);
 
+         if (__result == codecvt_base::noconv)
+           {
+             __outstr.assign(__first, __last);
+             _M_count = __outstr.size();
+             return __outstr;
+           }
+
          __outstr.resize(__outchars);
          _M_count = __next - __first;
 
index 07d2b520e978cab7b75bf50564ee4a8a08e603c1..9341f8928c4525842fbe3fbdb9bddb0ff992a23e 100644 (file)
@@ -36,6 +36,24 @@ using std::u32string;
 // test conversion errors, with and without error strings
 
 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;
 
@@ -53,7 +71,7 @@ void test01()
   VERIFY( berr == output );
 }
 
-void test02()
+void test03()
 {
   typedef str_conv<char32_t> sc;
 
@@ -75,4 +93,5 @@ int main()
 {
   test01();
   test02();
+  test03();
 }
index 7c4ac207cd86983510d073f57d4258c562c6fd10..6afa62ba2d1b0ebe5a81383d69ee35c2d1bde3cf 100644 (file)
@@ -30,11 +30,54 @@ template<typename Elem>
 using str_conv = std::wstring_convert<cvt<Elem>, Elem>;
 
 using std::string;
+using std::u16string;
 using std::u32string;
 
 // test construction with state, for partial conversions
 
 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;
 
@@ -44,7 +87,7 @@ void test01()
   auto partial_state = c.state();
   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" );
 
   wsc c2(new cvt<char32_t>, partial_state);
@@ -55,7 +98,10 @@ void test01()
   VERIFY( input == roundtrip );
 }
 
+
 int main()
 {
   test01();
+  test02();
+  test03();
 }