aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2015-03-05 13:36:21 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2015-03-05 13:36:21 +0000
commit9933260f2f921ab10415b5042fc5f04fe1afce95 (patch)
tree50604d2946731d58d3d58508dcad099b1efe9b27 /libstdc++-v3
parentbcda57c130753b36ee3dd495a1404bed4b43d291 (diff)
downloadgcc-9933260f2f921ab10415b5042fc5f04fe1afce95.zip
gcc-9933260f2f921ab10415b5042fc5f04fe1afce95.tar.gz
gcc-9933260f2f921ab10415b5042fc5f04fe1afce95.tar.bz2
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/locale_conv.h7
-rw-r--r--libstdc++-v3/testsuite/22_locale/conversions/string/2.cc21
-rw-r--r--libstdc++-v3/testsuite/22_locale/conversions/string/3.cc48
4 files changed, 81 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 16760da..ed4edf8 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/include/bits/locale_conv.h b/libstdc++-v3/include/bits/locale_conv.h
index b53754d..9b49617 100644
--- a/libstdc++-v3/include/bits/locale_conv.h
+++ b/libstdc++-v3/include/bits/locale_conv.h
@@ -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;
diff --git a/libstdc++-v3/testsuite/22_locale/conversions/string/2.cc b/libstdc++-v3/testsuite/22_locale/conversions/string/2.cc
index 07d2b52..9341f892 100644
--- a/libstdc++-v3/testsuite/22_locale/conversions/string/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/conversions/string/2.cc
@@ -37,6 +37,24 @@ using std::u32string;
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;
const sc::byte_string berr = "invalid wide string";
@@ -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();
}
diff --git a/libstdc++-v3/testsuite/22_locale/conversions/string/3.cc b/libstdc++-v3/testsuite/22_locale/conversions/string/3.cc
index 7c4ac20..6afa62b 100644
--- a/libstdc++-v3/testsuite/22_locale/conversions/string/3.cc
+++ b/libstdc++-v3/testsuite/22_locale/conversions/string/3.cc
@@ -30,12 +30,55 @@ 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;
wsc c;
@@ -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();
}