1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <locale>
11 
12 // wstring_convert<Codecvt, Elem, Wide_alloc, Byte_alloc>
13 
14 // wstring_convert(const byte_string& byte_err,
15 //                 const wide_string& wide_err = wide_string());
16 
17 #include <locale>
18 #include <codecvt>
19 #include <cassert>
20 
main()21 int main()
22 {
23     typedef std::codecvt_utf8<wchar_t> Codecvt;
24     typedef std::wstring_convert<Codecvt> Myconv;
25 #if _LIBCPP_STD_VER > 11
26     static_assert(!std::is_convertible<std::string, Myconv>::value, "");
27     static_assert( std::is_constructible<Myconv, std::string>::value, "");
28 #endif
29     {
30         Myconv myconv;
31         try
32         {
33             myconv.to_bytes(L"\xDA83");
34             assert(false);
35         }
36         catch (const std::range_error&)
37         {
38         }
39         try
40         {
41             myconv.from_bytes('\xA5');
42             assert(false);
43         }
44         catch (const std::range_error&)
45         {
46         }
47     }
48     {
49         Myconv myconv("byte error");
50         std::string bs = myconv.to_bytes(L"\xDA83");
51         assert(bs == "byte error");
52         try
53         {
54             myconv.from_bytes('\xA5');
55             assert(false);
56         }
57         catch (const std::range_error&)
58         {
59         }
60     }
61     {
62         Myconv myconv("byte error", L"wide error");
63         std::string bs = myconv.to_bytes(L"\xDA83");
64         assert(bs == "byte error");
65         std::wstring ws = myconv.from_bytes('\xA5');
66         assert(ws == L"wide error");
67     }
68 }
69