15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <codecvt>
105a83710eSEric Fiselier 
11*3ee9a50aSNikolas Klauser // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
12*3ee9a50aSNikolas Klauser 
135a83710eSEric Fiselier // template <class Elem, unsigned long Maxcode = 0x10ffff,
145a83710eSEric Fiselier //           codecvt_mode Mode = (codecvt_mode)0>
155a83710eSEric Fiselier // class codecvt_utf16
165a83710eSEric Fiselier //     : public codecvt<Elem, char, mbstate_t>
175a83710eSEric Fiselier // {
185a83710eSEric Fiselier //     // unspecified
195a83710eSEric Fiselier // };
205a83710eSEric Fiselier 
215a83710eSEric Fiselier // result
225a83710eSEric Fiselier //     in(stateT& state,
235a83710eSEric Fiselier //        const externT* from, const externT* from_end, const externT*& from_next,
245a83710eSEric Fiselier //        internT* to, internT* to_end, internT*& to_next) const;
255a83710eSEric Fiselier 
265a83710eSEric Fiselier #include <codecvt>
275a83710eSEric Fiselier #include <cassert>
285a83710eSEric Fiselier 
297fc6a556SMarshall Clow #include "test_macros.h"
307fc6a556SMarshall Clow 
main(int,char **)312df59c50SJF Bastien int main(int, char**)
325a83710eSEric Fiselier {
335a83710eSEric Fiselier     {
34b2684a52SSaleem Abdulrasool         typedef std::codecvt_utf16<char32_t> C;
355a83710eSEric Fiselier         C c;
36b2684a52SSaleem Abdulrasool         char32_t w = 0;
375a83710eSEric Fiselier         char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
38b2684a52SSaleem Abdulrasool         char32_t* wp = nullptr;
395a83710eSEric Fiselier         std::mbstate_t m;
405a83710eSEric Fiselier         const char* np = nullptr;
415a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
425a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
435a83710eSEric Fiselier         assert(wp == &w+1);
445a83710eSEric Fiselier         assert(np == n+4);
455a83710eSEric Fiselier         assert(w == 0x40003);
465a83710eSEric Fiselier 
475a83710eSEric Fiselier         n[0] = char(0x10);
485a83710eSEric Fiselier         n[1] = char(0x05);
495a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
505a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
515a83710eSEric Fiselier         assert(wp == &w+1);
525a83710eSEric Fiselier         assert(np == n+2);
535a83710eSEric Fiselier         assert(w == 0x1005);
545a83710eSEric Fiselier 
555a83710eSEric Fiselier         n[0] = char(0x04);
565a83710eSEric Fiselier         n[1] = char(0x53);
575a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
585a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
595a83710eSEric Fiselier         assert(wp == &w+1);
605a83710eSEric Fiselier         assert(np == n+2);
615a83710eSEric Fiselier         assert(w == 0x453);
625a83710eSEric Fiselier 
635a83710eSEric Fiselier         w = 0x56;
645a83710eSEric Fiselier         n[0] = char(0x00);
655a83710eSEric Fiselier         n[1] = char(0x56);
665a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
675a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
685a83710eSEric Fiselier         assert(wp == &w+1);
695a83710eSEric Fiselier         assert(np == n+2);
705a83710eSEric Fiselier         assert(w == 0x56);
715a83710eSEric Fiselier     }
725a83710eSEric Fiselier     {
73b2684a52SSaleem Abdulrasool         typedef std::codecvt_utf16<char32_t, 0x1000> C;
745a83710eSEric Fiselier         C c;
75b2684a52SSaleem Abdulrasool         char32_t w = 0;
765a83710eSEric Fiselier         char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
77b2684a52SSaleem Abdulrasool         char32_t* wp = nullptr;
785a83710eSEric Fiselier         std::mbstate_t m;
795a83710eSEric Fiselier         const char* np = nullptr;
805a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
815a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
825a83710eSEric Fiselier         assert(wp == &w);
835a83710eSEric Fiselier         assert(np == n);
845a83710eSEric Fiselier         assert(w == 0);
855a83710eSEric Fiselier 
865a83710eSEric Fiselier         n[0] = char(0x10);
875a83710eSEric Fiselier         n[1] = char(0x05);
885a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
895a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
905a83710eSEric Fiselier         assert(wp == &w);
915a83710eSEric Fiselier         assert(np == n);
925a83710eSEric Fiselier         assert(w == 0);
935a83710eSEric Fiselier 
945a83710eSEric Fiselier         n[0] = char(0x04);
955a83710eSEric Fiselier         n[1] = char(0x53);
965a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
975a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
985a83710eSEric Fiselier         assert(wp == &w+1);
995a83710eSEric Fiselier         assert(np == n+2);
1005a83710eSEric Fiselier         assert(w == 0x453);
1015a83710eSEric Fiselier 
1025a83710eSEric Fiselier         w = 0x56;
1035a83710eSEric Fiselier         n[0] = char(0x00);
1045a83710eSEric Fiselier         n[1] = char(0x56);
1055a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1065a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1075a83710eSEric Fiselier         assert(wp == &w+1);
1085a83710eSEric Fiselier         assert(np == n+2);
1095a83710eSEric Fiselier         assert(w == 0x56);
1105a83710eSEric Fiselier     }
1115a83710eSEric Fiselier     {
112b2684a52SSaleem Abdulrasool         typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;
1135a83710eSEric Fiselier         C c;
114b2684a52SSaleem Abdulrasool         char32_t w = 0;
1155a83710eSEric Fiselier         char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
116b2684a52SSaleem Abdulrasool         char32_t* wp = nullptr;
1175a83710eSEric Fiselier         std::mbstate_t m;
1185a83710eSEric Fiselier         const char* np = nullptr;
1195a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
1205a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1215a83710eSEric Fiselier         assert(wp == &w+1);
1225a83710eSEric Fiselier         assert(np == n+6);
1235a83710eSEric Fiselier         assert(w == 0x40003);
1245a83710eSEric Fiselier 
1255a83710eSEric Fiselier         n[0] = char(0x10);
1265a83710eSEric Fiselier         n[1] = char(0x05);
1275a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1285a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1295a83710eSEric Fiselier         assert(wp == &w+1);
1305a83710eSEric Fiselier         assert(np == n+2);
1315a83710eSEric Fiselier         assert(w == 0x1005);
1325a83710eSEric Fiselier 
1335a83710eSEric Fiselier         n[0] = char(0x04);
1345a83710eSEric Fiselier         n[1] = char(0x53);
1355a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1365a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1375a83710eSEric Fiselier         assert(wp == &w+1);
1385a83710eSEric Fiselier         assert(np == n+2);
1395a83710eSEric Fiselier         assert(w == 0x453);
1405a83710eSEric Fiselier 
1415a83710eSEric Fiselier         w = 0x56;
1425a83710eSEric Fiselier         n[0] = char(0x00);
1435a83710eSEric Fiselier         n[1] = char(0x56);
1445a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1455a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1465a83710eSEric Fiselier         assert(wp == &w+1);
1475a83710eSEric Fiselier         assert(np == n+2);
1485a83710eSEric Fiselier         assert(w == 0x56);
1495a83710eSEric Fiselier     }
1505a83710eSEric Fiselier     {
151b2684a52SSaleem Abdulrasool         typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;
1525a83710eSEric Fiselier         C c;
153b2684a52SSaleem Abdulrasool         char32_t w = 0;
1545a83710eSEric Fiselier         char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
155b2684a52SSaleem Abdulrasool         char32_t* wp = nullptr;
1565a83710eSEric Fiselier         std::mbstate_t m;
1575a83710eSEric Fiselier         const char* np = nullptr;
1585a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
1595a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1605a83710eSEric Fiselier         assert(wp == &w+1);
1615a83710eSEric Fiselier         assert(np == n+4);
1625a83710eSEric Fiselier         assert(w == 0x40003);
1635a83710eSEric Fiselier 
1645a83710eSEric Fiselier         n[1] = char(0x10);
1655a83710eSEric Fiselier         n[0] = char(0x05);
1665a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1675a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1685a83710eSEric Fiselier         assert(wp == &w+1);
1695a83710eSEric Fiselier         assert(np == n+2);
1705a83710eSEric Fiselier         assert(w == 0x1005);
1715a83710eSEric Fiselier 
1725a83710eSEric Fiselier         n[1] = char(0x04);
1735a83710eSEric Fiselier         n[0] = char(0x53);
1745a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1755a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1765a83710eSEric Fiselier         assert(wp == &w+1);
1775a83710eSEric Fiselier         assert(np == n+2);
1785a83710eSEric Fiselier         assert(w == 0x453);
1795a83710eSEric Fiselier 
1805a83710eSEric Fiselier         w = 0x56;
1815a83710eSEric Fiselier         n[1] = char(0x00);
1825a83710eSEric Fiselier         n[0] = char(0x56);
1835a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
1845a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
1855a83710eSEric Fiselier         assert(wp == &w+1);
1865a83710eSEric Fiselier         assert(np == n+2);
1875a83710eSEric Fiselier         assert(w == 0x56);
1885a83710eSEric Fiselier     }
1895a83710eSEric Fiselier     {
190b2684a52SSaleem Abdulrasool         typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;
1915a83710eSEric Fiselier         C c;
192b2684a52SSaleem Abdulrasool         char32_t w = 0;
1935a83710eSEric Fiselier         char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
194b2684a52SSaleem Abdulrasool         char32_t* wp = nullptr;
1955a83710eSEric Fiselier         std::mbstate_t m;
1965a83710eSEric Fiselier         const char* np = nullptr;
1975a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
1985a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
1995a83710eSEric Fiselier         assert(wp == &w);
2005a83710eSEric Fiselier         assert(np == n);
2015a83710eSEric Fiselier         assert(w == 0);
2025a83710eSEric Fiselier 
2035a83710eSEric Fiselier         n[1] = char(0x10);
2045a83710eSEric Fiselier         n[0] = char(0x05);
2055a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2065a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
2075a83710eSEric Fiselier         assert(wp == &w);
2085a83710eSEric Fiselier         assert(np == n);
2095a83710eSEric Fiselier         assert(w == 0);
2105a83710eSEric Fiselier 
2115a83710eSEric Fiselier         n[1] = char(0x04);
2125a83710eSEric Fiselier         n[0] = char(0x53);
2135a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2145a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2155a83710eSEric Fiselier         assert(wp == &w+1);
2165a83710eSEric Fiselier         assert(np == n+2);
2175a83710eSEric Fiselier         assert(w == 0x453);
2185a83710eSEric Fiselier 
2195a83710eSEric Fiselier         w = 0x56;
2205a83710eSEric Fiselier         n[1] = char(0x00);
2215a83710eSEric Fiselier         n[0] = char(0x56);
2225a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2235a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2245a83710eSEric Fiselier         assert(wp == &w+1);
2255a83710eSEric Fiselier         assert(np == n+2);
2265a83710eSEric Fiselier         assert(w == 0x56);
2275a83710eSEric Fiselier     }
2285a83710eSEric Fiselier     {
229b2684a52SSaleem Abdulrasool         typedef std::codecvt_utf16<char32_t, 0x10ffff,
230b2684a52SSaleem Abdulrasool                                    std::codecvt_mode(std::consume_header | std::little_endian)> C;
231b2684a52SSaleem Abdulrasool 
2325a83710eSEric Fiselier         C c;
233b2684a52SSaleem Abdulrasool         char32_t w = 0;
2345a83710eSEric Fiselier         char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
235b2684a52SSaleem Abdulrasool         char32_t* wp = nullptr;
2365a83710eSEric Fiselier         std::mbstate_t m;
2375a83710eSEric Fiselier         const char* np = nullptr;
2385a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
2395a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2405a83710eSEric Fiselier         assert(wp == &w+1);
2415a83710eSEric Fiselier         assert(np == n+6);
2425a83710eSEric Fiselier         assert(w == 0x40003);
2435a83710eSEric Fiselier 
2445a83710eSEric Fiselier         n[1] = char(0x10);
2455a83710eSEric Fiselier         n[0] = char(0x05);
2465a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2475a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2485a83710eSEric Fiselier         assert(wp == &w+1);
2495a83710eSEric Fiselier         assert(np == n+2);
2505a83710eSEric Fiselier         assert(w == 0x1005);
2515a83710eSEric Fiselier 
2525a83710eSEric Fiselier         n[1] = char(0x04);
2535a83710eSEric Fiselier         n[0] = char(0x53);
2545a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2555a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2565a83710eSEric Fiselier         assert(wp == &w+1);
2575a83710eSEric Fiselier         assert(np == n+2);
2585a83710eSEric Fiselier         assert(w == 0x453);
2595a83710eSEric Fiselier 
2605a83710eSEric Fiselier         w = 0x56;
2615a83710eSEric Fiselier         n[1] = char(0x00);
2625a83710eSEric Fiselier         n[0] = char(0x56);
2635a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2645a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2655a83710eSEric Fiselier         assert(wp == &w+1);
2665a83710eSEric Fiselier         assert(np == n+2);
2675a83710eSEric Fiselier         assert(w == 0x56);
2685a83710eSEric Fiselier     }
2695a83710eSEric Fiselier     {
2705a83710eSEric Fiselier         typedef std::codecvt_utf16<char32_t> C;
2715a83710eSEric Fiselier         C c;
2725a83710eSEric Fiselier         char32_t w = 0;
2735a83710eSEric Fiselier         char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
2745a83710eSEric Fiselier         char32_t* wp = nullptr;
2755a83710eSEric Fiselier         std::mbstate_t m;
2765a83710eSEric Fiselier         const char* np = nullptr;
2775a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
2785a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2795a83710eSEric Fiselier         assert(wp == &w+1);
2805a83710eSEric Fiselier         assert(np == n+4);
2815a83710eSEric Fiselier         assert(w == 0x40003);
2825a83710eSEric Fiselier 
2835a83710eSEric Fiselier         n[0] = char(0x10);
2845a83710eSEric Fiselier         n[1] = char(0x05);
2855a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2865a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2875a83710eSEric Fiselier         assert(wp == &w+1);
2885a83710eSEric Fiselier         assert(np == n+2);
2895a83710eSEric Fiselier         assert(w == 0x1005);
2905a83710eSEric Fiselier 
2915a83710eSEric Fiselier         n[0] = char(0x04);
2925a83710eSEric Fiselier         n[1] = char(0x53);
2935a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
2945a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
2955a83710eSEric Fiselier         assert(wp == &w+1);
2965a83710eSEric Fiselier         assert(np == n+2);
2975a83710eSEric Fiselier         assert(w == 0x453);
2985a83710eSEric Fiselier 
2995a83710eSEric Fiselier         w = 0x56;
3005a83710eSEric Fiselier         n[0] = char(0x00);
3015a83710eSEric Fiselier         n[1] = char(0x56);
3025a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3035a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3045a83710eSEric Fiselier         assert(wp == &w+1);
3055a83710eSEric Fiselier         assert(np == n+2);
3065a83710eSEric Fiselier         assert(w == 0x56);
3075a83710eSEric Fiselier     }
3085a83710eSEric Fiselier     {
3095a83710eSEric Fiselier         typedef std::codecvt_utf16<char32_t, 0x1000> C;
3105a83710eSEric Fiselier         C c;
3115a83710eSEric Fiselier         char32_t w = 0;
3125a83710eSEric Fiselier         char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
3135a83710eSEric Fiselier         char32_t* wp = nullptr;
3145a83710eSEric Fiselier         std::mbstate_t m;
3155a83710eSEric Fiselier         const char* np = nullptr;
3165a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
3175a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
3185a83710eSEric Fiselier         assert(wp == &w);
3195a83710eSEric Fiselier         assert(np == n);
3205a83710eSEric Fiselier         assert(w == 0);
3215a83710eSEric Fiselier 
3225a83710eSEric Fiselier         n[0] = char(0x10);
3235a83710eSEric Fiselier         n[1] = char(0x05);
3245a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3255a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
3265a83710eSEric Fiselier         assert(wp == &w);
3275a83710eSEric Fiselier         assert(np == n);
3285a83710eSEric Fiselier         assert(w == 0);
3295a83710eSEric Fiselier 
3305a83710eSEric Fiselier         n[0] = char(0x04);
3315a83710eSEric Fiselier         n[1] = char(0x53);
3325a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3335a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3345a83710eSEric Fiselier         assert(wp == &w+1);
3355a83710eSEric Fiselier         assert(np == n+2);
3365a83710eSEric Fiselier         assert(w == 0x453);
3375a83710eSEric Fiselier 
3385a83710eSEric Fiselier         w = 0x56;
3395a83710eSEric Fiselier         n[0] = char(0x00);
3405a83710eSEric Fiselier         n[1] = char(0x56);
3415a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3425a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3435a83710eSEric Fiselier         assert(wp == &w+1);
3445a83710eSEric Fiselier         assert(np == n+2);
3455a83710eSEric Fiselier         assert(w == 0x56);
3465a83710eSEric Fiselier     }
3475a83710eSEric Fiselier     {
3485a83710eSEric Fiselier         typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;
3495a83710eSEric Fiselier         C c;
3505a83710eSEric Fiselier         char32_t w = 0;
3515a83710eSEric Fiselier         char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
3525a83710eSEric Fiselier         char32_t* wp = nullptr;
3535a83710eSEric Fiselier         std::mbstate_t m;
3545a83710eSEric Fiselier         const char* np = nullptr;
3555a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
3565a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3575a83710eSEric Fiselier         assert(wp == &w+1);
3585a83710eSEric Fiselier         assert(np == n+6);
3595a83710eSEric Fiselier         assert(w == 0x40003);
3605a83710eSEric Fiselier 
3615a83710eSEric Fiselier         n[0] = char(0x10);
3625a83710eSEric Fiselier         n[1] = char(0x05);
3635a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3645a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3655a83710eSEric Fiselier         assert(wp == &w+1);
3665a83710eSEric Fiselier         assert(np == n+2);
3675a83710eSEric Fiselier         assert(w == 0x1005);
3685a83710eSEric Fiselier 
3695a83710eSEric Fiselier         n[0] = char(0x04);
3705a83710eSEric Fiselier         n[1] = char(0x53);
3715a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3725a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3735a83710eSEric Fiselier         assert(wp == &w+1);
3745a83710eSEric Fiselier         assert(np == n+2);
3755a83710eSEric Fiselier         assert(w == 0x453);
3765a83710eSEric Fiselier 
3775a83710eSEric Fiselier         w = 0x56;
3785a83710eSEric Fiselier         n[0] = char(0x00);
3795a83710eSEric Fiselier         n[1] = char(0x56);
3805a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
3815a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3825a83710eSEric Fiselier         assert(wp == &w+1);
3835a83710eSEric Fiselier         assert(np == n+2);
3845a83710eSEric Fiselier         assert(w == 0x56);
3855a83710eSEric Fiselier     }
3865a83710eSEric Fiselier     {
3875a83710eSEric Fiselier         typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;
3885a83710eSEric Fiselier         C c;
3895a83710eSEric Fiselier         char32_t w = 0;
3905a83710eSEric Fiselier         char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
3915a83710eSEric Fiselier         char32_t* wp = nullptr;
3925a83710eSEric Fiselier         std::mbstate_t m;
3935a83710eSEric Fiselier         const char* np = nullptr;
3945a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
3955a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
3965a83710eSEric Fiselier         assert(wp == &w+1);
3975a83710eSEric Fiselier         assert(np == n+4);
3985a83710eSEric Fiselier         assert(w == 0x40003);
3995a83710eSEric Fiselier 
4005a83710eSEric Fiselier         n[1] = char(0x10);
4015a83710eSEric Fiselier         n[0] = char(0x05);
4025a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4035a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4045a83710eSEric Fiselier         assert(wp == &w+1);
4055a83710eSEric Fiselier         assert(np == n+2);
4065a83710eSEric Fiselier         assert(w == 0x1005);
4075a83710eSEric Fiselier 
4085a83710eSEric Fiselier         n[1] = char(0x04);
4095a83710eSEric Fiselier         n[0] = char(0x53);
4105a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4115a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4125a83710eSEric Fiselier         assert(wp == &w+1);
4135a83710eSEric Fiselier         assert(np == n+2);
4145a83710eSEric Fiselier         assert(w == 0x453);
4155a83710eSEric Fiselier 
4165a83710eSEric Fiselier         w = 0x56;
4175a83710eSEric Fiselier         n[1] = char(0x00);
4185a83710eSEric Fiselier         n[0] = char(0x56);
4195a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4205a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4215a83710eSEric Fiselier         assert(wp == &w+1);
4225a83710eSEric Fiselier         assert(np == n+2);
4235a83710eSEric Fiselier         assert(w == 0x56);
4245a83710eSEric Fiselier     }
4255a83710eSEric Fiselier     {
4265a83710eSEric Fiselier         typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;
4275a83710eSEric Fiselier         C c;
4285a83710eSEric Fiselier         char32_t w = 0;
4295a83710eSEric Fiselier         char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
4305a83710eSEric Fiselier         char32_t* wp = nullptr;
4315a83710eSEric Fiselier         std::mbstate_t m;
4325a83710eSEric Fiselier         const char* np = nullptr;
4335a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
4345a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
4355a83710eSEric Fiselier         assert(wp == &w);
4365a83710eSEric Fiselier         assert(np == n);
4375a83710eSEric Fiselier         assert(w == 0);
4385a83710eSEric Fiselier 
4395a83710eSEric Fiselier         n[1] = char(0x10);
4405a83710eSEric Fiselier         n[0] = char(0x05);
4415a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4425a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
4435a83710eSEric Fiselier         assert(wp == &w);
4445a83710eSEric Fiselier         assert(np == n);
4455a83710eSEric Fiselier         assert(w == 0);
4465a83710eSEric Fiselier 
4475a83710eSEric Fiselier         n[1] = char(0x04);
4485a83710eSEric Fiselier         n[0] = char(0x53);
4495a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4505a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4515a83710eSEric Fiselier         assert(wp == &w+1);
4525a83710eSEric Fiselier         assert(np == n+2);
4535a83710eSEric Fiselier         assert(w == 0x453);
4545a83710eSEric Fiselier 
4555a83710eSEric Fiselier         w = 0x56;
4565a83710eSEric Fiselier         n[1] = char(0x00);
4575a83710eSEric Fiselier         n[0] = char(0x56);
4585a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4595a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4605a83710eSEric Fiselier         assert(wp == &w+1);
4615a83710eSEric Fiselier         assert(np == n+2);
4625a83710eSEric Fiselier         assert(w == 0x56);
4635a83710eSEric Fiselier     }
4645a83710eSEric Fiselier     {
4655a83710eSEric Fiselier         typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(
4665a83710eSEric Fiselier                                                          std::consume_header |
4675a83710eSEric Fiselier                                                          std::little_endian)> C;
4685a83710eSEric Fiselier         C c;
4695a83710eSEric Fiselier         char32_t w = 0;
4705a83710eSEric Fiselier         char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
4715a83710eSEric Fiselier         char32_t* wp = nullptr;
4725a83710eSEric Fiselier         std::mbstate_t m;
4735a83710eSEric Fiselier         const char* np = nullptr;
4745a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
4755a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4765a83710eSEric Fiselier         assert(wp == &w+1);
4775a83710eSEric Fiselier         assert(np == n+6);
4785a83710eSEric Fiselier         assert(w == 0x40003);
4795a83710eSEric Fiselier 
4805a83710eSEric Fiselier         n[1] = char(0x10);
4815a83710eSEric Fiselier         n[0] = char(0x05);
4825a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4835a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4845a83710eSEric Fiselier         assert(wp == &w+1);
4855a83710eSEric Fiselier         assert(np == n+2);
4865a83710eSEric Fiselier         assert(w == 0x1005);
4875a83710eSEric Fiselier 
4885a83710eSEric Fiselier         n[1] = char(0x04);
4895a83710eSEric Fiselier         n[0] = char(0x53);
4905a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
4915a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
4925a83710eSEric Fiselier         assert(wp == &w+1);
4935a83710eSEric Fiselier         assert(np == n+2);
4945a83710eSEric Fiselier         assert(w == 0x453);
4955a83710eSEric Fiselier 
4965a83710eSEric Fiselier         w = 0x56;
4975a83710eSEric Fiselier         n[1] = char(0x00);
4985a83710eSEric Fiselier         n[0] = char(0x56);
4995a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5005a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
5015a83710eSEric Fiselier         assert(wp == &w+1);
5025a83710eSEric Fiselier         assert(np == n+2);
5035a83710eSEric Fiselier         assert(w == 0x56);
5045a83710eSEric Fiselier     }
5055a83710eSEric Fiselier 
5065a83710eSEric Fiselier     {
5075a83710eSEric Fiselier         typedef std::codecvt_utf16<char16_t> C;
5085a83710eSEric Fiselier         C c;
5095a83710eSEric Fiselier         char16_t w = 0;
5105a83710eSEric Fiselier         char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
5115a83710eSEric Fiselier         char16_t* wp = nullptr;
5125a83710eSEric Fiselier         std::mbstate_t m;
5135a83710eSEric Fiselier         const char* np = nullptr;
5145a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
5155a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
5165a83710eSEric Fiselier         assert(wp == &w);
5175a83710eSEric Fiselier         assert(np == n);
5185a83710eSEric Fiselier         assert(w == 0);
5195a83710eSEric Fiselier 
5205a83710eSEric Fiselier         n[0] = char(0x10);
5215a83710eSEric Fiselier         n[1] = char(0x05);
5225a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5235a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
5245a83710eSEric Fiselier         assert(wp == &w+1);
5255a83710eSEric Fiselier         assert(np == n+2);
5265a83710eSEric Fiselier         assert(w == 0x1005);
5275a83710eSEric Fiselier 
5285a83710eSEric Fiselier         n[0] = char(0x04);
5295a83710eSEric Fiselier         n[1] = char(0x53);
5305a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5315a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
5325a83710eSEric Fiselier         assert(wp == &w+1);
5335a83710eSEric Fiselier         assert(np == n+2);
5345a83710eSEric Fiselier         assert(w == 0x453);
5355a83710eSEric Fiselier 
5365a83710eSEric Fiselier         w = 0x56;
5375a83710eSEric Fiselier         n[0] = char(0x00);
5385a83710eSEric Fiselier         n[1] = char(0x56);
5395a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5405a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
5415a83710eSEric Fiselier         assert(wp == &w+1);
5425a83710eSEric Fiselier         assert(np == n+2);
5435a83710eSEric Fiselier         assert(w == 0x56);
5445a83710eSEric Fiselier     }
5455a83710eSEric Fiselier     {
5465a83710eSEric Fiselier         typedef std::codecvt_utf16<char16_t, 0x1000> C;
5475a83710eSEric Fiselier         C c;
5485a83710eSEric Fiselier         char16_t w = 0;
5495a83710eSEric Fiselier         char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
5505a83710eSEric Fiselier         char16_t* wp = nullptr;
5515a83710eSEric Fiselier         std::mbstate_t m;
5525a83710eSEric Fiselier         const char* np = nullptr;
5535a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
5545a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
5555a83710eSEric Fiselier         assert(wp == &w);
5565a83710eSEric Fiselier         assert(np == n);
5575a83710eSEric Fiselier         assert(w == 0);
5585a83710eSEric Fiselier 
5595a83710eSEric Fiselier         n[0] = char(0x10);
5605a83710eSEric Fiselier         n[1] = char(0x05);
5615a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5625a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
5635a83710eSEric Fiselier         assert(wp == &w);
5645a83710eSEric Fiselier         assert(np == n);
5655a83710eSEric Fiselier         assert(w == 0);
5665a83710eSEric Fiselier 
5675a83710eSEric Fiselier         n[0] = char(0x04);
5685a83710eSEric Fiselier         n[1] = char(0x53);
5695a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5705a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
5715a83710eSEric Fiselier         assert(wp == &w+1);
5725a83710eSEric Fiselier         assert(np == n+2);
5735a83710eSEric Fiselier         assert(w == 0x453);
5745a83710eSEric Fiselier 
5755a83710eSEric Fiselier         w = 0x56;
5765a83710eSEric Fiselier         n[0] = char(0x00);
5775a83710eSEric Fiselier         n[1] = char(0x56);
5785a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
5795a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
5805a83710eSEric Fiselier         assert(wp == &w+1);
5815a83710eSEric Fiselier         assert(np == n+2);
5825a83710eSEric Fiselier         assert(w == 0x56);
5835a83710eSEric Fiselier     }
5845a83710eSEric Fiselier     {
5855a83710eSEric Fiselier         typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C;
5865a83710eSEric Fiselier         C c;
5875a83710eSEric Fiselier         char16_t w = 0;
5885a83710eSEric Fiselier         char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
5895a83710eSEric Fiselier         char16_t* wp = nullptr;
5905a83710eSEric Fiselier         std::mbstate_t m;
5915a83710eSEric Fiselier         const char* np = nullptr;
5925a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
5935a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
5945a83710eSEric Fiselier         assert(wp == &w);
5955a83710eSEric Fiselier         assert(np == n+2);
5965a83710eSEric Fiselier         assert(w == 0);
5975a83710eSEric Fiselier 
5985a83710eSEric Fiselier         n[0] = char(0x10);
5995a83710eSEric Fiselier         n[1] = char(0x05);
6005a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6015a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6025a83710eSEric Fiselier         assert(wp == &w+1);
6035a83710eSEric Fiselier         assert(np == n+2);
6045a83710eSEric Fiselier         assert(w == 0x1005);
6055a83710eSEric Fiselier 
6065a83710eSEric Fiselier         n[0] = char(0x04);
6075a83710eSEric Fiselier         n[1] = char(0x53);
6085a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6095a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6105a83710eSEric Fiselier         assert(wp == &w+1);
6115a83710eSEric Fiselier         assert(np == n+2);
6125a83710eSEric Fiselier         assert(w == 0x453);
6135a83710eSEric Fiselier 
6145a83710eSEric Fiselier         w = 0x56;
6155a83710eSEric Fiselier         n[0] = char(0x00);
6165a83710eSEric Fiselier         n[1] = char(0x56);
6175a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6185a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6195a83710eSEric Fiselier         assert(wp == &w+1);
6205a83710eSEric Fiselier         assert(np == n+2);
6215a83710eSEric Fiselier         assert(w == 0x56);
6225a83710eSEric Fiselier     }
6235a83710eSEric Fiselier     {
6245a83710eSEric Fiselier         typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C;
6255a83710eSEric Fiselier         C c;
6265a83710eSEric Fiselier         char16_t w = 0;
6275a83710eSEric Fiselier         char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
6285a83710eSEric Fiselier         char16_t* wp = nullptr;
6295a83710eSEric Fiselier         std::mbstate_t m;
6305a83710eSEric Fiselier         const char* np = nullptr;
6315a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
6325a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
6335a83710eSEric Fiselier         assert(wp == &w);
6345a83710eSEric Fiselier         assert(np == n);
6355a83710eSEric Fiselier         assert(w == 0);
6365a83710eSEric Fiselier 
6375a83710eSEric Fiselier         n[1] = char(0x10);
6385a83710eSEric Fiselier         n[0] = char(0x05);
6395a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6405a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6415a83710eSEric Fiselier         assert(wp == &w+1);
6425a83710eSEric Fiselier         assert(np == n+2);
6435a83710eSEric Fiselier         assert(w == 0x1005);
6445a83710eSEric Fiselier 
6455a83710eSEric Fiselier         n[1] = char(0x04);
6465a83710eSEric Fiselier         n[0] = char(0x53);
6475a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6485a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6495a83710eSEric Fiselier         assert(wp == &w+1);
6505a83710eSEric Fiselier         assert(np == n+2);
6515a83710eSEric Fiselier         assert(w == 0x453);
6525a83710eSEric Fiselier 
6535a83710eSEric Fiselier         w = 0x56;
6545a83710eSEric Fiselier         n[1] = char(0x00);
6555a83710eSEric Fiselier         n[0] = char(0x56);
6565a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6575a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6585a83710eSEric Fiselier         assert(wp == &w+1);
6595a83710eSEric Fiselier         assert(np == n+2);
6605a83710eSEric Fiselier         assert(w == 0x56);
6615a83710eSEric Fiselier     }
6625a83710eSEric Fiselier     {
6635a83710eSEric Fiselier         typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C;
6645a83710eSEric Fiselier         C c;
6655a83710eSEric Fiselier         char16_t w = 0;
6665a83710eSEric Fiselier         char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
6675a83710eSEric Fiselier         char16_t* wp = nullptr;
6685a83710eSEric Fiselier         std::mbstate_t m;
6695a83710eSEric Fiselier         const char* np = nullptr;
6705a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
6715a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
6725a83710eSEric Fiselier         assert(wp == &w);
6735a83710eSEric Fiselier         assert(np == n);
6745a83710eSEric Fiselier         assert(w == 0);
6755a83710eSEric Fiselier 
6765a83710eSEric Fiselier         n[1] = char(0x10);
6775a83710eSEric Fiselier         n[0] = char(0x05);
6785a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6795a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
6805a83710eSEric Fiselier         assert(wp == &w);
6815a83710eSEric Fiselier         assert(np == n);
6825a83710eSEric Fiselier         assert(w == 0);
6835a83710eSEric Fiselier 
6845a83710eSEric Fiselier         n[1] = char(0x04);
6855a83710eSEric Fiselier         n[0] = char(0x53);
6865a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6875a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6885a83710eSEric Fiselier         assert(wp == &w+1);
6895a83710eSEric Fiselier         assert(np == n+2);
6905a83710eSEric Fiselier         assert(w == 0x453);
6915a83710eSEric Fiselier 
6925a83710eSEric Fiselier         w = 0x56;
6935a83710eSEric Fiselier         n[1] = char(0x00);
6945a83710eSEric Fiselier         n[0] = char(0x56);
6955a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
6965a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
6975a83710eSEric Fiselier         assert(wp == &w+1);
6985a83710eSEric Fiselier         assert(np == n+2);
6995a83710eSEric Fiselier         assert(w == 0x56);
7005a83710eSEric Fiselier     }
7015a83710eSEric Fiselier     {
7025a83710eSEric Fiselier         typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(
7035a83710eSEric Fiselier                                                          std::consume_header |
7045a83710eSEric Fiselier                                                          std::little_endian)> C;
7055a83710eSEric Fiselier         C c;
7065a83710eSEric Fiselier         char16_t w = 0;
7075a83710eSEric Fiselier         char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
7085a83710eSEric Fiselier         char16_t* wp = nullptr;
7095a83710eSEric Fiselier         std::mbstate_t m;
7105a83710eSEric Fiselier         const char* np = nullptr;
7115a83710eSEric Fiselier         std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
7125a83710eSEric Fiselier         assert(r == std::codecvt_base::error);
7135a83710eSEric Fiselier         assert(wp == &w);
7145a83710eSEric Fiselier         assert(np == n+2);
7155a83710eSEric Fiselier         assert(w == 0);
7165a83710eSEric Fiselier 
7175a83710eSEric Fiselier         n[1] = char(0x10);
7185a83710eSEric Fiselier         n[0] = char(0x05);
7195a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
7205a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
7215a83710eSEric Fiselier         assert(wp == &w+1);
7225a83710eSEric Fiselier         assert(np == n+2);
7235a83710eSEric Fiselier         assert(w == 0x1005);
7245a83710eSEric Fiselier 
7255a83710eSEric Fiselier         n[1] = char(0x04);
7265a83710eSEric Fiselier         n[0] = char(0x53);
7275a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
7285a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
7295a83710eSEric Fiselier         assert(wp == &w+1);
7305a83710eSEric Fiselier         assert(np == n+2);
7315a83710eSEric Fiselier         assert(w == 0x453);
7325a83710eSEric Fiselier 
7335a83710eSEric Fiselier         w = 0x56;
7345a83710eSEric Fiselier         n[1] = char(0x00);
7355a83710eSEric Fiselier         n[0] = char(0x56);
7365a83710eSEric Fiselier         r = c.in(m, n, n+2, np, &w, &w+1, wp);
7375a83710eSEric Fiselier         assert(r == std::codecvt_base::ok);
7385a83710eSEric Fiselier         assert(wp == &w+1);
7395a83710eSEric Fiselier         assert(np == n+2);
7405a83710eSEric Fiselier         assert(w == 0x56);
7415a83710eSEric Fiselier     }
7422df59c50SJF Bastien 
7432df59c50SJF Bastien   return 0;
7445a83710eSEric Fiselier }
745