187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//===----------------------------------------------------------------------===//
287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//
387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//                     The LLVM Compiler Infrastructure
487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//
887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//===----------------------------------------------------------------------===//
987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
1087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// <codecvt>
1187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
1287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// template <class Elem, unsigned long Maxcode = 0x10ffff,
1387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//           codecvt_mode Mode = (codecvt_mode)0>
1487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// class codecvt_utf16
1587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//     : public codecvt<Elem, char, mbstate_t>
1687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// {
1787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//     // unspecified
1887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// };
1987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
2087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// result
2187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//     in(stateT& state,
2287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//        const externT* from, const externT* from_end, const externT*& from_next,
2387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant//        internT* to, internT* to_end, internT*& to_next) const;
2487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
2587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant#include <codecvt>
2687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant#include <cassert>
2787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
2887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint main()
2987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
3187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<wchar_t> C;
3287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
3387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t w = 0;
34ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
3587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t* wp = nullptr;
3687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
3787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
3887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
3987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
4087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
4187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+4);
4287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
4387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
4487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
4587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
4687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
4787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
4887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
4987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
5087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
5187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
5287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
5387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
5487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
5587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
5687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
5787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
5887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
5987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
6087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
6187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
6287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
6387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
6487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
6587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
6687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
6787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
6887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
6987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
7087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<wchar_t, 0x1000> C;
7187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
7287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t w = 0;
73ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
7487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t* wp = nullptr;
7587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
7687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
7787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
7887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
7987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
8087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
8187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
8287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
8387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
8487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
8587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
8687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
8787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
8887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
8987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
9087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
9187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
9287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
9387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
9487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
9587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
9687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
9787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
9887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
9987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
10087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
10187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
10287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
10387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
10487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
10587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
10687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
10787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
10887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
10987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header> C;
11087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
11187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t w = 0;
112ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
11387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t* wp = nullptr;
11487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
11587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
11687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
11787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
11887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
11987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+6);
12087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
12187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
12287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
12387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
12487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
12587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
12687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
12787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
12887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
12987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
13087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
13187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
13287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
13387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
13487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
13587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
13687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
13787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
13887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
13987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
14087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
14187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
14287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
14387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
14487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
14587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
14687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
14787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
14887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian> C;
14987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
15087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t w = 0;
151ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
15287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t* wp = nullptr;
15387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
15487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
15587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
15687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
15787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
15887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+4);
15987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
16087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
16187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
16287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
16387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
16487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
16587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
16687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
16787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
16887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
16987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
17087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
17187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
17287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
17387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
17487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
17587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
17687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
17787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
17887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
17987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
18087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
18187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
18287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
18387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
18487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
18587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
18687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
18787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<wchar_t, 0x1000, std::little_endian> C;
18887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
18987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t w = 0;
190ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
19187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t* wp = nullptr;
19287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
19387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
19487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
19587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
19687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
19787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
19887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
19987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
20087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
20187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
20287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
20387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
20487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
20587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
20687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
20787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
20887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
20987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
21087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
21187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
21287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
21387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
21487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
21587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
21687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
21787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
21887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
21987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
22087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
22187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
22287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
22387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
22487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
22587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
22687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode(
22787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                         std::consume_header |
22887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                         std::little_endian)> C;
22987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
23087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t w = 0;
231ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
23287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        wchar_t* wp = nullptr;
23387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
23487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
23587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
23687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
23787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
23887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+6);
23987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
24087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
24187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
24287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
24387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
24487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
24587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
24687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
24787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
24887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
24987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
25087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
25187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
25287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
25387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
25487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
25587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
25687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
25787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
25887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
25987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
26087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
26187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
26287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
26387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
26487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
26587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
26687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
26787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char32_t> C;
26887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
26987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t w = 0;
270ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
27187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t* wp = nullptr;
27287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
27387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
27487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
27587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
27687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
27787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+4);
27887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
27987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
28087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
28187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
28287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
28387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
28487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
28587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
28687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
28787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
28887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
28987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
29087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
29187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
29287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
29387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
29487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
29587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
29687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
29787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
29887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
29987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
30087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
30187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
30287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
30387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
30487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
30587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
30687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char32_t, 0x1000> C;
30787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
30887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t w = 0;
309ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
31087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t* wp = nullptr;
31187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
31287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
31387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
31487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
31587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
31687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
31787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
31887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
31987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
32087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
32187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
32287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
32387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
32487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
32587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
32687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
32787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
32887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
32987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
33087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
33187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
33287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
33387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
33487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
33587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
33687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
33787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
33887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
33987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
34087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
34187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
34287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
34387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
34487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
34587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;
34687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
34787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t w = 0;
348ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
34987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t* wp = nullptr;
35087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
35187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
35287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
35387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
35487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
35587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+6);
35687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
35787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
35887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
35987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
36087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
36187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
36287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
36387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
36487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
36587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
36687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
36787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
36887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
36987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
37087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
37187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
37287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
37387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
37487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
37587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
37687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
37787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
37887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
37987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
38087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
38187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
38287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
38387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
38487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;
38587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
38687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t w = 0;
387ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
38887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t* wp = nullptr;
38987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
39087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
39187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
39287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
39387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
39487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+4);
39587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
39687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
39787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
39887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
39987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
40087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
40187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
40287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
40387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
40487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
40587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
40687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
40787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
40887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
40987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
41087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
41187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
41287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
41387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
41487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
41587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
41687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
41787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
41887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
41987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
42087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
42187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
42287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
42387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;
42487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
42587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t w = 0;
426ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
42787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t* wp = nullptr;
42887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
42987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
43087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
43187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
43287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
43387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
43487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
43587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
43687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
43787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
43887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
43987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
44087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
44187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
44287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
44387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
44487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
44587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
44687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
44787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
44887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
44987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
45087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
45187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
45287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
45387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
45487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
45587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
45687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
45787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
45887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
45987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
46087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
46187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
46287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(
46387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                         std::consume_header |
46487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                         std::little_endian)> C;
46587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
46687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t w = 0;
467ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
46887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char32_t* wp = nullptr;
46987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
47087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
47187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
47287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
47387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
47487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+6);
47587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x40003);
47687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
47787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
47887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
47987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
48087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
48187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
48287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
48387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
48487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
48587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
48687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
48787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
48887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
48987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
49087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
49187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
49287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
49387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
49487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
49587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
49687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
49787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
49887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
49987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
50087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
50187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
50287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
50387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
50487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char16_t> C;
50587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
50687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t w = 0;
507ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
50887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t* wp = nullptr;
50987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
51087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
51187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
51287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
51387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
51487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
51587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
51687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
51787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
51887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
51987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
52087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
52187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
52287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
52387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
52487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
52587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
52687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
52787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
52887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
52987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
53087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
53187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
53287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
53387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
53487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
53587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
53687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
53787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
53887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
53987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
54087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
54187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
54287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
54387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char16_t, 0x1000> C;
54487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
54587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t w = 0;
546ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
54787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t* wp = nullptr;
54887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
54987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
55087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
55187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
55287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
55387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
55487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
55587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
55687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
55787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
55887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
55987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
56087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
56187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
56287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
56387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
56487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
56587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
56687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
56787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
56887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
56987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
57087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
57187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
57287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
57387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
57487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
57587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
57687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
57787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
57887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
57987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
58087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
58187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
58287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C;
58387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
58487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t w = 0;
585ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
58687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t* wp = nullptr;
58787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
58887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
58987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
59087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
59187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
59287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
59387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
59487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
59587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x10);
59687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x05);
59787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
59887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
59987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
60087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
60187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
60287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
60387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x04);
60487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x53);
60587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
60687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
60787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
60887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
60987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
61087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
61187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
61287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x00);
61387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x56);
61487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
61587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
61687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
61787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
61887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
61987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
62087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
62187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C;
62287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
62387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t w = 0;
624ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
62587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t* wp = nullptr;
62687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
62787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
62887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
62987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
63087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
63187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
63287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
63387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
63487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
63587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
63687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
63787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
63887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
63987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
64087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
64187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
64287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
64387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
64487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
64587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
64687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
64787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
64887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
64987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
65087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
65187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
65287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
65387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
65487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
65587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
65687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
65787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
65887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
65987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
66087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C;
66187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
66287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t w = 0;
663ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
66487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t* wp = nullptr;
66587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
66687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
66787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
66887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
66987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
67087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
67187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
67287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
67387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
67487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
67587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
67687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
67787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
67887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n);
67987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
68087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
68187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
68287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
68387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
68487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
68587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
68687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
68787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
68887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
68987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
69087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
69187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
69287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
69387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
69487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
69587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
69687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
69787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
69887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
69987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(
70087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                         std::consume_header |
70187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                         std::little_endian)> C;
70287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        C c;
70387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t w = 0;
704ef0036c5aa3c3e78ee97af78caa649d657a6372cHoward Hinnant        char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
70587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        char16_t* wp = nullptr;
70687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::mbstate_t m;
70787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        const char* np = nullptr;
70887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
70987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::error);
71087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w);
71187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
71287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0);
71387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
71487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x10);
71587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x05);
71687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
71787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
71887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
71987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
72087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x1005);
72187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
72287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x04);
72387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x53);
72487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
72587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
72687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
72787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
72887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x453);
72987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
73087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        w = 0x56;
73187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[1] = char(0x00);
73287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        n[0] = char(0x56);
73387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        r = c.in(m, n, n+2, np, &w, &w+1, wp);
73487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(r == std::codecvt_base::ok);
73587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(wp == &w+1);
73687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(np == n+2);
73787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        assert(w == 0x56);
73887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
73987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
740