Fix std::codecvt_utf8* for big-endian targets
authorJonathan Wakely <jwakely@redhat.com>
Wed, 20 Apr 2016 17:40:02 +0000 (18:40 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 20 Apr 2016 17:40:02 +0000 (18:40 +0100)
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

libstdc++-v3/ChangeLog
libstdc++-v3/src/c++11/codecvt.cc

index 6eed9a323152c43afea31f0091d94368c8937c6d..e6934a5972ef10ea387e7daabe1f80ac11fc3f9d 100644 (file)
@@ -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
index b6b63584fbe5db1769b2e010b4e794b140c8a95f..b60691cf2a65d63e21c7413e09272f74163d8215 100644 (file)
@@ -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