aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-04-20 18:40:02 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-04-20 18:40:02 +0100
commita1e1ec76058dfe6d995555ce8f6633882e99e84d (patch)
tree083d5afccff7d9acb19632340efe3fd655c5c102
parent1011119f4752c6f1a97156d3a24ea7dff7c0cb02 (diff)
downloadgcc-a1e1ec76058dfe6d995555ce8f6633882e99e84d.zip
gcc-a1e1ec76058dfe6d995555ce8f6633882e99e84d.tar.gz
gcc-a1e1ec76058dfe6d995555ce8f6633882e99e84d.tar.bz2
Fix std::codecvt_utf8* for big-endian targets
PR libstdc++/69703 * src/c++11/codecvt.cc (__codecvt_utf8_base<char16_t>::do_in, __codecvt_utf8_utf16_base<char16_t>::do_in): Fix mask operations. From-SVN: r235293
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/src/c++11/codecvt.cc4
2 files changed, 9 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6eed9a3..e6934a5 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,7 +1,13 @@
+2016-04-20 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/69703
+ * src/c++11/codecvt.cc (__codecvt_utf8_base<char16_t>::do_in,
+ __codecvt_utf8_utf16_base<char16_t>::do_in): Fix mask operations.
+
2016-04-19 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/69703
- * src/c++11/codecvt.cc (__codecvt_utf8_base<char16_t>::do_in)):
+ * src/c++11/codecvt.cc (__codecvt_utf8_base<char16_t>::do_in):
Override endianness bit in mode.
* testsuite/22_locale/codecvt/codecvt_utf8/69703.cc: New test.
* testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc: Test
diff --git a/libstdc++-v3/src/c++11/codecvt.cc b/libstdc++-v3/src/c++11/codecvt.cc
index b6b6358..b60691c 100644
--- a/libstdc++-v3/src/c++11/codecvt.cc
+++ b/libstdc++-v3/src/c++11/codecvt.cc
@@ -789,7 +789,7 @@ do_in(state_type&, const extern_type* __from, const extern_type* __from_end,
{
range<const char> from{ __from, __from_end };
range<char16_t> to{ __to, __to_end };
- codecvt_mode mode = codecvt_mode(_M_mode | (consume_header|generate_header));
+ codecvt_mode mode = codecvt_mode(_M_mode & (consume_header|generate_header));
#if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
mode = codecvt_mode(mode | little_endian);
#endif
@@ -1268,7 +1268,7 @@ do_in(state_type&, const extern_type* __from, const extern_type* __from_end,
{
range<const char> from{ __from, __from_end };
range<char16_t> to{ __to, __to_end };
- codecvt_mode mode = codecvt_mode(_M_mode | (consume_header|generate_header));
+ codecvt_mode mode = codecvt_mode(_M_mode & (consume_header|generate_header));
#if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
mode = codecvt_mode(mode | little_endian);
#endif