diff --git a/stl/inc/xlocale b/stl/inc/xlocale index 6a2f168ab7..2d47e75cdc 100644 --- a/stl/inc/xlocale +++ b/stl/inc/xlocale @@ -1397,7 +1397,7 @@ struct _NODISCARD _Codecvt_guard { }; extern "C++" template <> -class codecvt : public codecvt_base { +class _CXX20_DEPRECATE_CODECVT_CHAR8_T_FACETS codecvt : public codecvt_base { // facet for converting between UTF-16 and UTF-8 sequences public: using intern_type = char16_t; @@ -1678,7 +1678,7 @@ protected: }; extern "C++" template <> -class codecvt : public codecvt_base { +class _CXX20_DEPRECATE_CODECVT_CHAR8_T_FACETS codecvt : public codecvt_base { // facet for converting between UTF-32 and UTF-8 sequences public: using intern_type = char32_t; @@ -2321,26 +2321,85 @@ private: #endif // defined(_NATIVE_WCHAR_T_DEFINED) && !_ENFORCE_FACET_SPECIALIZATIONS _EXPORT_STD template -class codecvt_byname : public codecvt<_Elem, _Byte, _Statype> { // codecvt for named locale +class codecvt_byname : public codecvt<_Elem, _Byte, _Statype> { public: static_assert(!_ENFORCE_FACET_SPECIALIZATIONS - || _Is_any_of_v, codecvt_byname, -#endif // defined(__cpp_char8_t) - codecvt_byname, codecvt_byname>, + || _Is_any_of_v, + codecvt_byname>, _FACET_SPECIALIZATION_MESSAGE); explicit __CLR_OR_THIS_CALL codecvt_byname(const char* _Locname, size_t _Refs = 0) - : codecvt<_Elem, _Byte, _Statype>(_Locinfo(_Locname), _Refs) {} // construct for named locale + : codecvt<_Elem, _Byte, _Statype>(_Locinfo(_Locname), _Refs) {} + + explicit __CLR_OR_THIS_CALL codecvt_byname(const string& _Str, size_t _Refs = 0) + : codecvt<_Elem, _Byte, _Statype>(_Locinfo(_Str.c_str()), _Refs) {} + +protected: + __CLR_OR_THIS_CALL ~codecvt_byname() noexcept override {} +}; + +_STL_DISABLE_DEPRECATED_WARNING + +template <> +class _CXX20_DEPRECATE_CODECVT_FACETS codecvt_byname + : public codecvt { +public: + explicit __CLR_OR_THIS_CALL codecvt_byname(const char* _Locname, size_t _Refs = 0) + : codecvt(_Locinfo(_Locname), _Refs) {} + + explicit __CLR_OR_THIS_CALL codecvt_byname(const string& _Str, size_t _Refs = 0) + : codecvt(_Locinfo(_Str.c_str()), _Refs) {} + +protected: + __CLR_OR_THIS_CALL ~codecvt_byname() noexcept override {} +}; + +template <> +class _CXX20_DEPRECATE_CODECVT_FACETS codecvt_byname + : public codecvt { +public: + explicit __CLR_OR_THIS_CALL codecvt_byname(const char* _Locname, size_t _Refs = 0) + : codecvt(_Locinfo(_Locname), _Refs) {} + + explicit __CLR_OR_THIS_CALL codecvt_byname(const string& _Str, size_t _Refs = 0) + : codecvt(_Locinfo(_Str.c_str()), _Refs) {} + +protected: + __CLR_OR_THIS_CALL ~codecvt_byname() noexcept override {} +}; + +#ifdef __cpp_char8_t +template <> +class _CXX20_DEPRECATE_CODECVT_CHAR8_T_FACETS codecvt_byname + : public codecvt { +public: + explicit __CLR_OR_THIS_CALL codecvt_byname(const char* _Locname, size_t _Refs = 0) + : codecvt(_Locinfo(_Locname), _Refs) {} explicit __CLR_OR_THIS_CALL codecvt_byname(const string& _Str, size_t _Refs = 0) - : codecvt<_Elem, _Byte, _Statype>(_Locinfo(_Str.c_str()), _Refs) {} // construct for named locale + : codecvt(_Locinfo(_Str.c_str()), _Refs) {} protected: __CLR_OR_THIS_CALL ~codecvt_byname() noexcept override {} }; +template <> +class _CXX20_DEPRECATE_CODECVT_CHAR8_T_FACETS codecvt_byname + : public codecvt { +public: + explicit __CLR_OR_THIS_CALL codecvt_byname(const char* _Locname, size_t _Refs = 0) + : codecvt(_Locinfo(_Locname), _Refs) {} + + explicit __CLR_OR_THIS_CALL codecvt_byname(const string& _Str, size_t _Refs = 0) + : codecvt(_Locinfo(_Str.c_str()), _Refs) {} + +protected: + __CLR_OR_THIS_CALL ~codecvt_byname() noexcept override {} +}; +#endif // defined(__cpp_char8_t) + +_STL_RESTORE_DEPRECATED_WARNING + #define _XA 0x100 // extra alphabetic #define _BB _CONTROL // BEL, BS, etc. #define _CN _SPACE // CR, FF, HT, NL, VT diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index e027e322a9..678341f07e 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -1253,8 +1253,7 @@ _EMIT_STL_ERROR(STL1004, "C++98 unexpected() is incompatible with C++23 unexpect [[deprecated("warning STL4020: " \ "std::codecvt, std::codecvt, " \ "std::codecvt_byname, and std::codecvt_byname " \ - "are deprecated in C++20 and replaced by specializations with a second argument of type char8_t. " \ - "You can define _SILENCE_CXX20_CODECVT_FACETS_DEPRECATION_WARNING " \ + "are deprecated in C++20. You can define _SILENCE_CXX20_CODECVT_FACETS_DEPRECATION_WARNING " \ "or _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS to suppress this warning.")]] #else // ^^^ warning enabled / warning disabled vvv #define _CXX20_DEPRECATE_CODECVT_FACETS @@ -1514,7 +1513,19 @@ _EMIT_STL_ERROR(STL1004, "C++98 unexpected() is incompatible with C++23 unexpect #define _DEPRECATE_TR1_RANDOM #endif // ^^^ warning disabled ^^^ -// next warning number: STL4047 +#if _HAS_CXX20 && defined(__cpp_char8_t) && !defined(_SILENCE_CXX20_CODECVT_CHAR8_T_FACETS_DEPRECATION_WARNING) \ + && !defined(_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS) +#define _CXX20_DEPRECATE_CODECVT_CHAR8_T_FACETS \ + [[deprecated( \ + "warning STL4047: std::codecvt, std::codecvt, " \ + "std::codecvt_byname, and std::codecvt_byname " \ + "are deprecated by LWG-3767. You can define _SILENCE_CXX20_CODECVT_CHAR8_T_FACETS_DEPRECATION_WARNING or " \ + "_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS to suppress this warning.")]] +#else // ^^^ warning enabled / warning disabled vvv +#define _CXX20_DEPRECATE_CODECVT_CHAR8_T_FACETS +#endif // ^^^ warning disabled ^^^ + +// next warning number: STL4048 // next error number: STL1006 diff --git a/tests/std/tests/Dev09_056375_locale_cleanup/test.cpp b/tests/std/tests/Dev09_056375_locale_cleanup/test.cpp index 1fecfd287e..02bbe0388c 100644 --- a/tests/std/tests/Dev09_056375_locale_cleanup/test.cpp +++ b/tests/std/tests/Dev09_056375_locale_cleanup/test.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #define _SILENCE_CXX20_CODECVT_FACETS_DEPRECATION_WARNING +#define _SILENCE_CXX20_CODECVT_CHAR8_T_FACETS_DEPRECATION_WARNING #include #include diff --git a/tests/std/tests/VSO_0397980_codecvt_length/test.cpp b/tests/std/tests/VSO_0397980_codecvt_length/test.cpp index 7558dc5f4e..9bcad7435f 100644 --- a/tests/std/tests/VSO_0397980_codecvt_length/test.cpp +++ b/tests/std/tests/VSO_0397980_codecvt_length/test.cpp @@ -3,6 +3,7 @@ #define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING #define _SILENCE_CXX20_CODECVT_FACETS_DEPRECATION_WARNING +#define _SILENCE_CXX20_CODECVT_CHAR8_T_FACETS_DEPRECATION_WARNING #undef _ENFORCE_FACET_SPECIALIZATIONS #define _ENFORCE_FACET_SPECIALIZATIONS 0