diff --git a/libcxx/include/__locale b/libcxx/include/__locale --- a/libcxx/include/__locale +++ b/libcxx/include/__locale @@ -108,7 +108,6 @@ }; #endif - class _LIBCPP_TYPE_VIS locale; template <class _Facet> @@ -1074,10 +1073,10 @@ virtual int do_max_length() const _NOEXCEPT; }; -// template <> class codecvt<char16_t, char, mbstate_t> +// template <> class codecvt<char16_t, char, mbstate_t> // deprecated in C++20 template <> -class _LIBCPP_TYPE_VIS codecvt<char16_t, char, mbstate_t> +class _LIBCPP_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt<char16_t, char, mbstate_t> : public locale::facet, public codecvt_base { @@ -1160,10 +1159,100 @@ virtual int do_max_length() const _NOEXCEPT; }; -// template <> class codecvt<char32_t, char, mbstate_t> +#ifndef _LIBCPP_NO_HAS_CHAR8_T + +// template <> class codecvt<char16_t, char8_t, mbstate_t> // C++20 + +template <> +class _LIBCPP_TYPE_VIS codecvt<char16_t, char8_t, mbstate_t> + : public locale::facet, + public codecvt_base +{ +public: + typedef char16_t intern_type; + typedef char8_t extern_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + explicit codecvt(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_INLINE_VISIBILITY + result out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_INLINE_VISIBILITY + result unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_unshift(__st, __to, __to_end, __to_nxt); + } + + _LIBCPP_INLINE_VISIBILITY + result in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const + { + return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_INLINE_VISIBILITY + int encoding() const _NOEXCEPT + { + return do_encoding(); + } + + _LIBCPP_INLINE_VISIBILITY + bool always_noconv() const _NOEXCEPT + { + return do_always_noconv(); + } + + _LIBCPP_INLINE_VISIBILITY + int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const + { + return do_length(__st, __frm, __end, __mx); + } + + _LIBCPP_INLINE_VISIBILITY + int max_length() const _NOEXCEPT + { + return do_max_length(); + } + + static locale::id id; + +protected: + _LIBCPP_INLINE_VISIBILITY + explicit codecvt(const char*, size_t __refs = 0) + : locale::facet(__refs) {} + + ~codecvt(); + + virtual result do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const _NOEXCEPT; + virtual bool do_always_noconv() const _NOEXCEPT; + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const; + virtual int do_max_length() const _NOEXCEPT; +}; + +#endif + +// template <> class codecvt<char32_t, char, mbstate_t> // deprecated in C++20 template <> -class _LIBCPP_TYPE_VIS codecvt<char32_t, char, mbstate_t> +class _LIBCPP_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt<char32_t, char, mbstate_t> : public locale::facet, public codecvt_base { @@ -1246,6 +1335,96 @@ virtual int do_max_length() const _NOEXCEPT; }; +#ifndef _LIBCPP_NO_HAS_CHAR8_T + +// template <> class codecvt<char32_t, char8_t, mbstate_t> // C++20 + +template <> +class _LIBCPP_TYPE_VIS codecvt<char32_t, char8_t, mbstate_t> + : public locale::facet, + public codecvt_base +{ +public: + typedef char32_t intern_type; + typedef char8_t extern_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + explicit codecvt(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_INLINE_VISIBILITY + result out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_INLINE_VISIBILITY + result unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_unshift(__st, __to, __to_end, __to_nxt); + } + + _LIBCPP_INLINE_VISIBILITY + result in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const + { + return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_INLINE_VISIBILITY + int encoding() const _NOEXCEPT + { + return do_encoding(); + } + + _LIBCPP_INLINE_VISIBILITY + bool always_noconv() const _NOEXCEPT + { + return do_always_noconv(); + } + + _LIBCPP_INLINE_VISIBILITY + int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const + { + return do_length(__st, __frm, __end, __mx); + } + + _LIBCPP_INLINE_VISIBILITY + int max_length() const _NOEXCEPT + { + return do_max_length(); + } + + static locale::id id; + +protected: + _LIBCPP_INLINE_VISIBILITY + explicit codecvt(const char*, size_t __refs = 0) + : locale::facet(__refs) {} + + ~codecvt(); + + virtual result do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const _NOEXCEPT; + virtual bool do_always_noconv() const _NOEXCEPT; + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const; + virtual int do_max_length() const _NOEXCEPT; +}; + +#endif + // template <class _InternT, class _ExternT, class _StateT> class codecvt_byname template <class _InternT, class _ExternT, class _StateT> @@ -1263,15 +1442,21 @@ ~codecvt_byname(); }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <class _InternT, class _ExternT, class _StateT> codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname() { } +_LIBCPP_SUPPRESS_DEPRECATED_POP _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>) _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>) -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>) -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>) +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char16_t, char, mbstate_t>) // deprecated in C++20 +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char32_t, char, mbstate_t>) // deprecated in C++20 +#ifndef _LIBCPP_NO_HAS_CHAR8_T +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char8_t, mbstate_t>) // C++20 +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char8_t, mbstate_t>) // C++20 +#endif template <size_t _Np> struct __narrow_to_utf8 @@ -1295,12 +1480,14 @@ } }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> struct _LIBCPP_TEMPLATE_VIS __narrow_to_utf8<16> : public codecvt<char16_t, char, mbstate_t> { _LIBCPP_INLINE_VISIBILITY __narrow_to_utf8() : codecvt<char16_t, char, mbstate_t>(1) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP _LIBCPP_EXPORTED_FROM_ABI ~__narrow_to_utf8(); @@ -1329,12 +1516,14 @@ } }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> struct _LIBCPP_TEMPLATE_VIS __narrow_to_utf8<32> : public codecvt<char32_t, char, mbstate_t> { _LIBCPP_INLINE_VISIBILITY __narrow_to_utf8() : codecvt<char32_t, char, mbstate_t>(1) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP _LIBCPP_EXPORTED_FROM_ABI ~__narrow_to_utf8(); @@ -1385,12 +1574,14 @@ } }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> struct _LIBCPP_TEMPLATE_VIS __widen_from_utf8<16> : public codecvt<char16_t, char, mbstate_t> { _LIBCPP_INLINE_VISIBILITY __widen_from_utf8() : codecvt<char16_t, char, mbstate_t>(1) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP _LIBCPP_EXPORTED_FROM_ABI ~__widen_from_utf8(); @@ -1419,12 +1610,14 @@ } }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> struct _LIBCPP_TEMPLATE_VIS __widen_from_utf8<32> : public codecvt<char32_t, char, mbstate_t> { _LIBCPP_INLINE_VISIBILITY __widen_from_utf8() : codecvt<char32_t, char, mbstate_t>(1) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP _LIBCPP_EXPORTED_FROM_ABI ~__widen_from_utf8(); diff --git a/libcxx/include/codecvt b/libcxx/include/codecvt --- a/libcxx/include/codecvt +++ b/libcxx/include/codecvt @@ -109,6 +109,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf8<char16_t> : public codecvt<char16_t, char, mbstate_t> @@ -125,6 +126,8 @@ codecvt_mode _Mode) : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -144,6 +147,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf8<char32_t> : public codecvt<char32_t, char, mbstate_t> @@ -160,6 +164,8 @@ codecvt_mode _Mode) : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -267,6 +273,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, false> : public codecvt<char16_t, char, mbstate_t> @@ -283,6 +290,8 @@ codecvt_mode _Mode) : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -302,6 +311,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, true> : public codecvt<char16_t, char, mbstate_t> @@ -318,6 +328,8 @@ codecvt_mode _Mode) : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -337,6 +349,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, false> : public codecvt<char32_t, char, mbstate_t> @@ -353,6 +366,8 @@ codecvt_mode _Mode) : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -372,6 +387,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, true> : public codecvt<char32_t, char, mbstate_t> @@ -388,6 +404,8 @@ codecvt_mode _Mode) : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -460,6 +478,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char32_t> : public codecvt<char32_t, char, mbstate_t> @@ -476,6 +495,8 @@ codecvt_mode _Mode) : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, @@ -495,6 +516,7 @@ virtual int do_max_length() const _NOEXCEPT; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template <> class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char16_t> : public codecvt<char16_t, char, mbstate_t> @@ -511,6 +533,8 @@ codecvt_mode _Mode) : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), _Mode_(_Mode) {} +_LIBCPP_SUPPRESS_DEPRECATED_POP + protected: virtual result do_out(state_type& __st, diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -158,7 +158,7 @@ class _LIBCPP_HIDDEN locale::__imp : public facet { - enum {N = 28}; + enum {N = 30}; #if defined(_LIBCPP_COMPILER_MSVC) // FIXME: MSVC doesn't support aligned parameters by value. // I can't get the __sso_allocator to work here @@ -202,8 +202,14 @@ install(&make<_VSTD::ctype<wchar_t> >(1u)); install(&make<codecvt<char, char, mbstate_t> >(1u)); install(&make<codecvt<wchar_t, char, mbstate_t> >(1u)); +_LIBCPP_SUPPRESS_DEPRECATED_PUSH install(&make<codecvt<char16_t, char, mbstate_t> >(1u)); install(&make<codecvt<char32_t, char, mbstate_t> >(1u)); +_LIBCPP_SUPPRESS_DEPRECATED_POP +#ifndef _LIBCPP_NO_HAS_CHAR8_T + install(&make<codecvt<char16_t, char8_t, mbstate_t> >(1u)); + install(&make<codecvt<char32_t, char8_t, mbstate_t> >(1u)); +#endif install(&make<numpunct<char> >(1u)); install(&make<numpunct<wchar_t> >(1u)); install(&make<num_get<char> >(1u)); @@ -245,8 +251,14 @@ install(new ctype_byname<wchar_t>(name_)); install(new codecvt_byname<char, char, mbstate_t>(name_)); install(new codecvt_byname<wchar_t, char, mbstate_t>(name_)); +_LIBCPP_SUPPRESS_DEPRECATED_PUSH install(new codecvt_byname<char16_t, char, mbstate_t>(name_)); install(new codecvt_byname<char32_t, char, mbstate_t>(name_)); +_LIBCPP_SUPPRESS_DEPRECATED_POP +#ifndef _LIBCPP_NO_HAS_CHAR8_T + install(new codecvt_byname<char16_t, char8_t, mbstate_t>(name_)); + install(new codecvt_byname<char32_t, char8_t, mbstate_t>(name_)); +#endif install(new numpunct_byname<char>(name_)); install(new numpunct_byname<wchar_t>(name_)); install(new moneypunct_byname<char, false>(name_)); @@ -315,8 +327,14 @@ install(new ctype_byname<wchar_t>(name)); install(new codecvt_byname<char, char, mbstate_t>(name)); install(new codecvt_byname<wchar_t, char, mbstate_t>(name)); +_LIBCPP_SUPPRESS_DEPRECATED_PUSH install(new codecvt_byname<char16_t, char, mbstate_t>(name)); install(new codecvt_byname<char32_t, char, mbstate_t>(name)); +_LIBCPP_SUPPRESS_DEPRECATED_POP +#ifndef _LIBCPP_NO_HAS_CHAR8_T + install(new codecvt_byname<char16_t, char8_t, mbstate_t>(name)); + install(new codecvt_byname<char32_t, char8_t, mbstate_t>(name)); +#endif } if (c & locale::monetary) { @@ -385,8 +403,14 @@ install_from<_VSTD::ctype<char> >(one); install_from<_VSTD::ctype<wchar_t> >(one); install_from<_VSTD::codecvt<char, char, mbstate_t> >(one); +_LIBCPP_SUPPRESS_DEPRECATED_PUSH install_from<_VSTD::codecvt<char16_t, char, mbstate_t> >(one); install_from<_VSTD::codecvt<char32_t, char, mbstate_t> >(one); +_LIBCPP_SUPPRESS_DEPRECATED_POP +#ifndef _LIBCPP_NO_HAS_CHAR8_T + install_from<_VSTD::codecvt<char16_t, char8_t, mbstate_t> >(one); + install_from<_VSTD::codecvt<char32_t, char8_t, mbstate_t> >(one); +#endif install_from<_VSTD::codecvt<wchar_t, char, mbstate_t> >(one); } if (c & locale::monetary) @@ -3171,6 +3195,87 @@ return 4; } +#ifndef _LIBCPP_NO_HAS_CHAR8_T + +// template <> class codecvt<char16_t, char8_t, mbstate_t> + +locale::id codecvt<char16_t, char8_t, mbstate_t>::id; + +codecvt<char16_t, char8_t, mbstate_t>::~codecvt() +{ +} + +codecvt<char16_t, char8_t, mbstate_t>::result +codecvt<char16_t, char8_t, mbstate_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char16_t, char8_t, mbstate_t>::result +codecvt<char16_t, char8_t, mbstate_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char16_t, char8_t, mbstate_t>::result +codecvt<char16_t, char8_t, mbstate_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +codecvt<char16_t, char8_t, mbstate_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +codecvt<char16_t, char8_t, mbstate_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +codecvt<char16_t, char8_t, mbstate_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_utf16_length(_frm, _frm_end, mx); +} + +int +codecvt<char16_t, char8_t, mbstate_t>::do_max_length() const _NOEXCEPT +{ + return 4; +} + +#endif + // template <> class codecvt<char32_t, char, mbstate_t> locale::id codecvt<char32_t, char, mbstate_t>::id; @@ -3248,6 +3353,87 @@ return 4; } +#ifndef _LIBCPP_NO_HAS_CHAR8_T + +// template <> class codecvt<char32_t, char8_t, mbstate_t> + +locale::id codecvt<char32_t, char8_t, mbstate_t>::id; + +codecvt<char32_t, char8_t, mbstate_t>::~codecvt() +{ +} + +codecvt<char32_t, char8_t, mbstate_t>::result +codecvt<char32_t, char8_t, mbstate_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char32_t, char8_t, mbstate_t>::result +codecvt<char32_t, char8_t, mbstate_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char32_t, char8_t, mbstate_t>::result +codecvt<char32_t, char8_t, mbstate_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +codecvt<char32_t, char8_t, mbstate_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +codecvt<char32_t, char8_t, mbstate_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +codecvt<char32_t, char8_t, mbstate_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_ucs4_length(_frm, _frm_end, mx); +} + +int +codecvt<char32_t, char8_t, mbstate_t>::do_max_length() const _NOEXCEPT +{ + return 4; +} + +#endif + // __codecvt_utf8<wchar_t> __codecvt_utf8<wchar_t>::result @@ -6148,7 +6334,11 @@ template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char, char, mbstate_t>; template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<wchar_t, char, mbstate_t>; -template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char16_t, char, mbstate_t>; -template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char32_t, char, mbstate_t>; +template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char16_t, char, mbstate_t>; +template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char32_t, char, mbstate_t>; +#ifndef _LIBCPP_NO_HAS_CHAR8_T +template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char16_t, char8_t, mbstate_t>; +template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char32_t, char8_t, mbstate_t>; +#endif _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp b/libcxx/test/libcxx/localization/locales/locale/locale.types/locale.facet/no_allocation.pass.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp copy to libcxx/test/libcxx/localization/locales/locale/locale.types/locale.facet/no_allocation.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp +++ b/libcxx/test/libcxx/localization/locales/locale/locale.types/locale.facet/no_allocation.pass.cpp @@ -8,22 +8,16 @@ // <locale> -// template <> class codecvt<char16_t, char, mbstate_t> +// This test verifies that the construction of locale::__imp does not allocate +// for facets, as it uses __sso_allocator<facet*, N>. It would fail if new +// facets have been added (using install()) but N hasn't been adjusted to +// account for them. -// bool always_noconv() const throw(); - -#include <locale> #include <cassert> -#include "test_macros.h" - -typedef std::codecvt<char16_t, char, std::mbstate_t> F; - -int main(int, char**) -{ - std::locale l = std::locale::classic(); - const F& f = std::use_facet<F>(l); - assert(!f.always_noconv()); +#include "count_new.h" +int main(int, char**) { + assert(globalMemCounter.checkOutstandingNewEq(0)); return 0; } diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/codecvt_byname_char16_t_char.depr_in_cxx20.verify.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp copy to libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/codecvt_byname_char16_t_char.depr_in_cxx20.verify.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/codecvt_byname_char16_t_char.depr_in_cxx20.verify.cpp @@ -8,22 +8,20 @@ // <locale> -// template <> class codecvt<char16_t, char, mbstate_t> +// codecvt_byname<char16_t, char, mbstate_t> +// deprecated in C++20 -// bool always_noconv() const throw(); +// UNSUPPORTED: c++03, c++11, c++14, c++17 #include <locale> -#include <cassert> +#include "../with_public_dtor.hpp" #include "test_macros.h" -typedef std::codecvt<char16_t, char, std::mbstate_t> F; - -int main(int, char**) +int main(int, char **) { - std::locale l = std::locale::classic(); - const F& f = std::use_facet<F>(l); - assert(!f.always_noconv()); + with_public_dtor<std::codecvt_byname<char16_t, char, std::mbstate_t>> cvt("", 0); // expected-warning {{'codecvt_byname<char16_t, char, __mbstate_t>' is deprecated}} + (void)cvt; - return 0; + return 0; } diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/codecvt_byname_char32_t_char.depr_in_cxx20.verify.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp copy to libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/codecvt_byname_char32_t_char.depr_in_cxx20.verify.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/codecvt_byname_char32_t_char.depr_in_cxx20.verify.cpp @@ -8,22 +8,20 @@ // <locale> -// template <> class codecvt<char16_t, char, mbstate_t> +// codecvt_byname<char32_t, char, mbstate_t> +// deprecated in C++20 -// bool always_noconv() const throw(); +// UNSUPPORTED: c++03, c++11, c++14, c++17 #include <locale> -#include <cassert> +#include "../with_public_dtor.hpp" #include "test_macros.h" -typedef std::codecvt<char16_t, char, std::mbstate_t> F; - -int main(int, char**) +int main(int, char **) { - std::locale l = std::locale::classic(); - const F& f = std::use_facet<F>(l); - assert(!f.always_noconv()); + with_public_dtor<std::codecvt_byname<char32_t, char, std::mbstate_t>> cvt("", 0); // expected-warning {{'codecvt_byname<char32_t, char, __mbstate_t>' is deprecated}} + (void)cvt; - return 0; + return 0; } diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t.pass.cpp @@ -13,6 +13,9 @@ // explicit codecvt_byname(const char* nm, size_t refs = 0); // explicit codecvt_byname(const string& nm, size_t refs = 0); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t_char8_t.pass.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp copy to libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t_char8_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char16_t_char8_t.pass.cpp @@ -8,17 +8,19 @@ // <locale> -// template <> class codecvt_byname<char32_t, char, mbstate_t> +// template <> class codecvt_byname<char16_t, char8_t, mbstate_t> // explicit codecvt_byname(const char* nm, size_t refs = 0); // explicit codecvt_byname(const string& nm, size_t refs = 0); +// UNSUPPORTED: c++03, c++11, c++14, c++17 + #include <locale> #include <cassert> #include "test_macros.h" -typedef std::codecvt_byname<char32_t, char, std::mbstate_t> F; +typedef std::codecvt_byname<char16_t, char8_t, std::mbstate_t> F; class my_facet : public F diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp @@ -13,6 +13,9 @@ // explicit codecvt_byname(const char* nm, size_t refs = 0); // explicit codecvt_byname(const string& nm, size_t refs = 0); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t_char8_t.pass.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp copy to libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t_char8_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_char32_t_char8_t.pass.cpp @@ -8,17 +8,19 @@ // <locale> -// template <> class codecvt_byname<char32_t, char, mbstate_t> +// template <> class codecvt_byname<char32_t, char8_t, mbstate_t> // explicit codecvt_byname(const char* nm, size_t refs = 0); // explicit codecvt_byname(const string& nm, size_t refs = 0); +// UNSUPPORTED: c++03, c++11, c++14, c++17 + #include <locale> #include <cassert> #include "test_macros.h" -typedef std::codecvt_byname<char32_t, char, std::mbstate_t> F; +typedef std::codecvt_byname<char32_t, char8_t, std::mbstate_t> F; class my_facet : public F diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/codecvt_char16_t_char.depr_in_cxx20.verify.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp copy to libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/codecvt_char16_t_char.depr_in_cxx20.verify.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/codecvt_char16_t_char.depr_in_cxx20.verify.cpp @@ -8,22 +8,20 @@ // <locale> -// template <> class codecvt<char16_t, char, mbstate_t> +// codecvt<char16_t, char, mbstate_t> +// deprecated in C++20 -// bool always_noconv() const throw(); +// UNSUPPORTED: c++03, c++11, c++14, c++17 #include <locale> -#include <cassert> +#include "../with_public_dtor.hpp" #include "test_macros.h" -typedef std::codecvt<char16_t, char, std::mbstate_t> F; - -int main(int, char**) +int main(int, char **) { - std::locale l = std::locale::classic(); - const F& f = std::use_facet<F>(l); - assert(!f.always_noconv()); + with_public_dtor<std::codecvt<char16_t, char, std::mbstate_t>> cvt("", 0); // expected-warning {{'codecvt<char16_t, char, __mbstate_t>' is deprecated}} + (void)cvt; - return 0; + return 0; } diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/codecvt_char32_t_char.depr_in_cxx20.verify.cpp copy from libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp copy to libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/codecvt_char32_t_char.depr_in_cxx20.verify.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/codecvt_char32_t_char.depr_in_cxx20.verify.cpp @@ -8,22 +8,20 @@ // <locale> -// template <> class codecvt<char16_t, char, mbstate_t> +// codecvt<char32_t, char, mbstate_t> +// deprecated in C++20 -// bool always_noconv() const throw(); +// UNSUPPORTED: c++03, c++11, c++14, c++17 #include <locale> -#include <cassert> +#include "../with_public_dtor.hpp" #include "test_macros.h" -typedef std::codecvt<char16_t, char, std::mbstate_t> F; - -int main(int, char**) +int main(int, char **) { - std::locale l = std::locale::classic(); - const F& f = std::use_facet<F>(l); - assert(!f.always_noconv()); + with_public_dtor<std::codecvt<char32_t, char, std::mbstate_t>> cvt("", 0); // expected-warning {{'codecvt<char32_t, char, __mbstate_t>' is deprecated}} + (void)cvt; - return 0; + return 0; } diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t.pass.cpp @@ -12,6 +12,9 @@ // explicit codecvt(size_t refs = 0); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t_char8_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t_char8_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t_char8_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char16_t_char8_t.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t.pass.cpp @@ -12,6 +12,9 @@ // explicit codecvt(size_t refs = 0); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t_char8_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t_char8_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t_char8_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_char32_t_char8_t.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_always_noconv.pass.cpp @@ -12,6 +12,9 @@ // bool always_noconv() const throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_always_noconv.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_always_noconv.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_encoding.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_encoding.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_encoding.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_encoding.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_in.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_in.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_in.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_in.pass.cpp @@ -16,9 +16,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_length.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_max_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_max_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_max_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_max_length.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_out.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_out.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_out.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_out.pass.cpp @@ -16,9 +16,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_unshift.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_unshift.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_unshift.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_char8_t_unshift.pass.cpp @@ -15,9 +15,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_encoding.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_encoding.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_encoding.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_encoding.pass.cpp @@ -12,6 +12,9 @@ // int encoding() const throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_in.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_in.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_in.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_in.pass.cpp @@ -14,6 +14,9 @@ // const externT* from, const externT* from_end, const externT*& from_next, // internT* to, internT* to_end, internT*& to_next) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <string> #include <vector> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_length.pass.cpp @@ -12,6 +12,9 @@ // int length(stateT& state, const externT* from, const externT* from_end, size_t max) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_max_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_max_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_max_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_max_length.pass.cpp @@ -12,6 +12,9 @@ // int max_length() const throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_out.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_out.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_out.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_out.pass.cpp @@ -14,6 +14,9 @@ // const internT* from, const internT* from_end, const internT*& from_next, // externT* to, externT* to_end, externT*& to_next) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <string> #include <vector> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_unshift.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_unshift.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_unshift.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char16_t_unshift.pass.cpp @@ -13,6 +13,9 @@ // result unshift(stateT& state, // externT* to, externT* to_end, externT*& to_next) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <string> #include <vector> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_always_noconv.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_always_noconv.pass.cpp @@ -12,6 +12,9 @@ // bool always_noconv() const throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_always_noconv.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_always_noconv.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_always_noconv.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_always_noconv.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_encoding.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_encoding.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_encoding.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_encoding.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_in.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_in.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_in.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_in.pass.cpp @@ -16,9 +16,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_length.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_max_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_max_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_max_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_max_length.pass.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_out.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_out.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_out.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_out.pass.cpp @@ -16,9 +16,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_unshift.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_unshift.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_unshift.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_char8_t_unshift.pass.cpp @@ -15,9 +15,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_encoding.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_encoding.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_encoding.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_encoding.pass.cpp @@ -12,6 +12,9 @@ // int encoding() const throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_in.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_in.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_in.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_in.pass.cpp @@ -14,6 +14,9 @@ // const externT* from, const externT* from_end, const externT*& from_next, // internT* to, internT* to_end, internT*& to_next) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <string> #include <vector> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_length.pass.cpp @@ -12,6 +12,9 @@ // int length(stateT& state, const externT* from, const externT* from_end, size_t max) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_max_length.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_max_length.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_max_length.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_max_length.pass.cpp @@ -12,6 +12,9 @@ // int max_length() const throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_out.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_out.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_out.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_out.pass.cpp @@ -14,6 +14,9 @@ // const internT* from, const internT* from_end, const internT*& from_next, // externT* to, externT* to_end, externT*& to_next) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <string> #include <vector> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_unshift.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_unshift.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_unshift.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/char32_t_unshift.pass.cpp @@ -13,6 +13,9 @@ // result unshift(stateT& state, // externT* to, externT* to_end, externT*& to_next) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <string> #include <vector> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/utf_sanity_check.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/utf_sanity_check.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/utf_sanity_check.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/utf_sanity_check.pass.cpp @@ -16,6 +16,9 @@ // sanity check +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <codecvt> #include <cassert> @@ -47,8 +50,7 @@ char* c16cp; F32_8::extern_type c8[4]; -// C++20 codecvt specializations for char8_t are not yet implemented -#if TEST_STD_VER > 17 && !defined(_LIBCPP_VERSION) +#if TEST_STD_VER > 17 typedef std::codecvt<char32_t, char8_t, std::mbstate_t> F32_8T; typedef std::codecvt<char16_t, char8_t, std::mbstate_t> F16_8T; const F32_8T& f32_8t = std::use_facet<F32_8T>(std::locale::classic()); @@ -69,8 +71,7 @@ F32_8::error); #endif -// C++20 codecvt specializations for char8_t are not yet implemented -#if TEST_STD_VER > 17 && !defined(_LIBCPP_VERSION) +#if TEST_STD_VER > 17 assert(f32_8t.out(mbs32_8t, &c32x, &c32x + 1, c_c32p, c8t, c8t + 4, c8tp) == F32_8T::error); #endif @@ -153,8 +154,7 @@ assert(c32p - &c32 == 1); assert(c32 == c32x); -// C++20 codecvt specializations for char8_t are not yet implemented -#if TEST_STD_VER > 17 && !defined(_LIBCPP_VERSION) +#if TEST_STD_VER > 17 assert(f32_8t.out(mbs32_8t, &c32x, &c32x + 1, c_c32p, c8t, c8t + 4, c8tp) == F32_8T::ok); assert(c_c32p - &c32x == 1); diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t.pass.cpp @@ -20,6 +20,9 @@ // ... // }; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <type_traits> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t_char8_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t_char8_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t_char8_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char16_t_char8_t.pass.cpp @@ -22,9 +22,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> #include <type_traits> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t.pass.cpp @@ -20,6 +20,9 @@ // ... // }; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <type_traits> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t_char8_t.pass.cpp b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t_char8_t.pass.cpp --- a/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t_char8_t.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_char32_t_char8_t.pass.cpp @@ -22,9 +22,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// C++20 codecvt specializations for char8_t are not yet implemented: -// UNSUPPORTED: libc++ - #include <cassert> #include <locale> #include <type_traits> diff --git a/libcxx/test/std/localization/locale.categories/category.ctype/with_public_dtor.hpp b/libcxx/test/std/localization/locale.categories/category.ctype/with_public_dtor.hpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/localization/locale.categories/category.ctype/with_public_dtor.hpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <utility> + +template <typename T> +struct with_public_dtor : T +{ + template <typename... Args> + explicit with_public_dtor(Args &&... args) + : T(std::forward<Args>(args)...) + { + } +}; diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/assign.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/assign.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/assign.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/assign.pass.cpp @@ -12,6 +12,9 @@ // const locale& operator=(const locale& other) throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> #include <new> @@ -32,6 +35,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp @@ -16,6 +16,9 @@ // explicit locale(const char* std_name); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <new> #include <cassert> @@ -36,6 +39,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/copy.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/copy.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/copy.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/copy.pass.cpp @@ -12,6 +12,9 @@ // locale(const locale& other) throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> #include <new> @@ -30,6 +33,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/default.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/default.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/default.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/default.pass.cpp @@ -12,6 +12,9 @@ // locale() throw(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> @@ -29,6 +32,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp @@ -14,6 +14,9 @@ // locale(const locale& other, const char* std_name, category); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <new> #include <cassert> @@ -32,6 +35,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp @@ -12,6 +12,9 @@ // template <class Facet> locale(const locale& other, Facet* f); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <new> #include <cassert> @@ -31,6 +34,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp @@ -14,6 +14,9 @@ // locale(const locale& other, const locale& one, category cats); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <new> #include <cassert> @@ -32,6 +35,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp @@ -14,6 +14,9 @@ // locale(const locale& other, const string& std_name, category cat); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <new> #include <cassert> @@ -33,6 +36,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.cons/string.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.cons/string.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.cons/string.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.cons/string.pass.cpp @@ -13,6 +13,9 @@ // explicit locale(const string& std_name); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <new> #include <cassert> @@ -31,6 +34,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.members/combine.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.members/combine.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.members/combine.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.members/combine.pass.cpp @@ -10,6 +10,9 @@ // template <class Facet> locale combine(const locale& other) const; +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <stdexcept> #include <cassert> @@ -28,6 +31,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.statics/classic.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.statics/classic.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.statics/classic.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.statics/classic.pass.cpp @@ -10,6 +10,9 @@ // static const locale& classic(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> @@ -25,6 +28,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc))); diff --git a/libcxx/test/std/localization/locales/locale/locale.statics/global.pass.cpp b/libcxx/test/std/localization/locales/locale/locale.statics/global.pass.cpp --- a/libcxx/test/std/localization/locales/locale/locale.statics/global.pass.cpp +++ b/libcxx/test/std/localization/locales/locale/locale.statics/global.pass.cpp @@ -12,6 +12,9 @@ // static const locale& classic(); +// This test runs in C++20, but we have deprecated codecvt<char(16|32), char, mbstate_t> in C++20. +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include <locale> #include <cassert> @@ -28,6 +31,10 @@ assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc))); +#if TEST_STD_VER > 17 + assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc))); + assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc))); +#endif assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc))); assert((std::has_facet<std::moneypunct<char> >(loc)));