From 2b60191e5a3a8cfd193d62052016bf398ff877e6 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 22 Jan 2020 21:58:02 +0100 Subject: [PATCH 01/11] [type_traits] Remove deprecated is_literal_type --- stl/inc/type_traits | 2 ++ stl/inc/yvals_core.h | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/stl/inc/type_traits b/stl/inc/type_traits index 04a7e1f8478..f4f48af7702 100644 --- a/stl/inc/type_traits +++ b/stl/inc/type_traits @@ -563,6 +563,7 @@ struct is_standard_layout : bool_constant<__is_standard_layout(_Ty)> {}; // dete template _INLINE_VAR constexpr bool is_standard_layout_v = __is_standard_layout(_Ty); +#if _HAS_DEPRECATED_IS_LITERAL_TYPE // STRUCT TEMPLATE is_literal_type template struct _CXX17_DEPRECATE_IS_LITERAL_TYPE is_literal_type : bool_constant<__is_literal_type(_Ty)> { @@ -571,6 +572,7 @@ struct _CXX17_DEPRECATE_IS_LITERAL_TYPE is_literal_type : bool_constant<__is_lit template _CXX17_DEPRECATE_IS_LITERAL_TYPE _INLINE_VAR constexpr bool is_literal_type_v = __is_literal_type(_Ty); +#endif // _HAS_DEPRECATED_IS_LITERAL_TYPE // STRUCT TEMPLATE is_trivial #if 1 // TRANSITION, VSO-119526 and LLVM-41915 diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 60be7ce8fc5..bc9c3db4656 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -183,6 +183,9 @@ // P1959R0 Removing weak_equality And strong_equality // P????R? directory_entry::clear_cache() +// _HAS_CXX20 indirectly controls: +// P0619R4 Removing C++17-Deprecated Features + // _HAS_CXX20 and _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS control: // P0767R1 Deprecating is_pod // Other C++20 deprecation warnings @@ -902,6 +905,14 @@ // next warning number: STL4029 +// P0619R4 Removing C++17-Deprecated Features +#ifndef _HAS_FEATURES_REMOVED_IN_CXX20 +#define _HAS_FEATURES_REMOVED_IN_CXX20 (!_HAS_CXX20) +#endif // _HAS_FEATURES_REMOVED_IN_CXX20 + +#ifndef _HAS_DEPRECATED_IS_LITERAL_TYPE +#define _HAS_DEPRECATED_IS_LITERAL_TYPE (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_IS_LITERAL_TYPE // LIBRARY FEATURE-TEST MACROS From 252c9b79b470f981593bd1c85329542d36295770 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 22 Jan 2020 21:59:56 +0100 Subject: [PATCH 02/11] [type_traits] Remove deprecated result_of --- stl/inc/type_traits | 4 ++++ stl/inc/yvals_core.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/stl/inc/type_traits b/stl/inc/type_traits index f4f48af7702..e06b19f825b 100644 --- a/stl/inc/type_traits +++ b/stl/inc/type_traits @@ -1702,6 +1702,7 @@ struct _Invoke_traits()...))>, conjunction_v<_Is_nothrow_invocable, disjunction, _Is_nothrow_convertible>>>; }; +#if _HAS_DEPRECATED_RESULT_OF // STRUCT TEMPLATE result_of template struct _CXX17_DEPRECATE_RESULT_OF result_of { // explain usage @@ -1722,6 +1723,7 @@ _STL_DISABLE_DEPRECATED_WARNING template using result_of_t _CXX17_DEPRECATE_RESULT_OF = typename result_of<_Ty>::type; _STL_RESTORE_DEPRECATED_WARNING +#endif // _HAS_DEPRECATED_RESULT_OF template using _Invoke_result_t = typename _Invoke_traits::type; @@ -2292,7 +2294,9 @@ namespace _DEPRECATE_TR1_NAMESPACE tr1 { using _STD cref; using _STD ref; using _STD reference_wrapper; +#if _HAS_DEPRECATED_RESULT_OF using _STD result_of; +#endif // _HAS_DEPRECATED_RESULT_OF using _STD hash; } // namespace tr1 _STL_RESTORE_DEPRECATED_WARNING diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index bc9c3db4656..7708c311163 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -914,6 +914,10 @@ #define _HAS_DEPRECATED_IS_LITERAL_TYPE (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_IS_LITERAL_TYPE +#ifndef _HAS_DEPRECATED_RESULT_OF +#define _HAS_DEPRECATED_RESULT_OF (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_RESULT_OF + // LIBRARY FEATURE-TEST MACROS // C++14 From 62b65aee3e7e56558bf46c18cba4f2eac9089f92 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 20 Nov 2019 14:20:09 +0100 Subject: [PATCH 03/11] [memory] Remove deprecated shared_ptr::unique --- stl/inc/memory | 2 ++ stl/inc/yvals_core.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/stl/inc/memory b/stl/inc/memory index 74160579e41..a0487f60ebe 100644 --- a/stl/inc/memory +++ b/stl/inc/memory @@ -1205,10 +1205,12 @@ public: return get()[_Idx]; } +#if _HAS_DEPRECATED_SHARED_PTR_UNIQUE _CXX17_DEPRECATE_SHARED_PTR_UNIQUE _NODISCARD bool unique() const noexcept { // return true if no other shared_ptr object owns this resource return this->use_count() == 1; } +#endif // _HAS_DEPRECATED_SHARED_PTR_UNIQUE explicit operator bool() const noexcept { return get() != nullptr; diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 7708c311163..ef73942abcb 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -918,6 +918,10 @@ #define _HAS_DEPRECATED_RESULT_OF (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_RESULT_OF +#ifndef _HAS_DEPRECATED_SHARED_PTR_UNIQUE +#define _HAS_DEPRECATED_SHARED_PTR_UNIQUE (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_SHARED_PTR_UNIQUE + // LIBRARY FEATURE-TEST MACROS // C++14 From 5e05a9c058351ed3f9651223bb580af09ad8dfae Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Fri, 13 Dec 2019 09:44:31 +0100 Subject: [PATCH 04/11] [functional] Remove deprecated negators --- stl/inc/functional | 2 ++ stl/inc/yvals_core.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/stl/inc/functional b/stl/inc/functional index 7d957c222db..e8be3324475 100644 --- a/stl/inc/functional +++ b/stl/inc/functional @@ -314,6 +314,7 @@ struct bit_not { } }; +#if _HAS_DEPRECATED_NEGATORS _STL_DISABLE_DEPRECATED_WARNING // CLASS TEMPLATE unary_negate template @@ -362,6 +363,7 @@ _CXX17_DEPRECATE_NEGATORS _NODISCARD constexpr binary_negate<_Fn> not2(const _Fn return binary_negate<_Fn>(_Func); } _STL_RESTORE_DEPRECATED_WARNING +#endif // _HAS_DEPRECATED_NEGATORS #if _HAS_AUTO_PTR_ETC _STL_DISABLE_DEPRECATED_WARNING diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index ef73942abcb..a5f9ff32dd1 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -922,6 +922,10 @@ #define _HAS_DEPRECATED_SHARED_PTR_UNIQUE (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_SHARED_PTR_UNIQUE +#ifndef _HAS_DEPRECATED_NEGATORS +#define _HAS_DEPRECATED_NEGATORS (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_NEGATORS + // LIBRARY FEATURE-TEST MACROS // C++14 From b6b5260c74522bb838edac93dc0cc2c532f63c06 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Fri, 13 Dec 2019 10:10:29 +0100 Subject: [PATCH 05/11] [functional] Remove deprecated adaptor typedefs --- stl/inc/bitset | 4 ++-- stl/inc/functional | 56 +++++++++++++++++++++---------------------- stl/inc/map | 6 ++--- stl/inc/memory | 16 ++++++------- stl/inc/system_error | 8 +++---- stl/inc/thread | 4 ++-- stl/inc/type_traits | 42 ++++++++++++++++---------------- stl/inc/typeindex | 4 ++-- stl/inc/unordered_map | 4 ++++ stl/inc/unordered_set | 4 ++++ stl/inc/variant | 4 ++-- stl/inc/vector | 4 ++-- stl/inc/xstddef | 54 ++++++++++++++++++++--------------------- stl/inc/xstring | 8 +++---- stl/inc/yvals_core.h | 16 +++++++++++++ 15 files changed, 129 insertions(+), 105 deletions(-) diff --git a/stl/inc/bitset b/stl/inc/bitset index 0a612bd4ee1..d7868783fbc 100644 --- a/stl/inc/bitset +++ b/stl/inc/bitset @@ -549,8 +549,8 @@ basic_istream<_Elem, _Tr>& operator>>(basic_istream<_Elem, _Tr>& _Istr, bitset<_ // STRUCT TEMPLATE SPECIALIZATION hash template struct hash> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bitset<_Bits> argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bitset<_Bits> _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const bitset<_Bits>& _Keyval) const noexcept { return _Hash_representation(_Keyval._Array); diff --git a/stl/inc/functional b/stl/inc/functional index e8be3324475..14152accf31 100644 --- a/stl/inc/functional +++ b/stl/inc/functional @@ -38,9 +38,9 @@ _STD_BEGIN // STRUCT TEMPLATE divides template struct divides { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left / _Right; @@ -50,9 +50,9 @@ struct divides { // STRUCT TEMPLATE modulus template struct modulus { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left % _Right; @@ -62,8 +62,8 @@ struct modulus { // STRUCT TEMPLATE negate template struct negate { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left) const { return -_Left; @@ -91,9 +91,9 @@ struct negate { // STRUCT TEMPLATE logical_and template struct logical_and { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left && _Right; @@ -103,9 +103,9 @@ struct logical_and { // STRUCT TEMPLATE logical_or template struct logical_or { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left || _Right; @@ -115,8 +115,8 @@ struct logical_or { // STRUCT TEMPLATE logical_not template struct logical_not { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left) const { return !_Left; @@ -126,9 +126,9 @@ struct logical_not { // STRUCT TEMPLATE bit_and template struct bit_and { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left & _Right; @@ -138,9 +138,9 @@ struct bit_and { // STRUCT TEMPLATE bit_or template struct bit_or { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left | _Right; @@ -150,9 +150,9 @@ struct bit_or { // STRUCT TEMPLATE bit_xor template struct bit_xor { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left ^ _Right; @@ -162,8 +162,8 @@ struct bit_xor { // STRUCT TEMPLATE bit_not template struct bit_not { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left) const { return ~_Left; @@ -1430,7 +1430,7 @@ auto _Call_binder(_Invoker_ret<_Ret>, index_sequence<_Ix...>, _Cv_FD& _Obj, _Cv_ // CLASS TEMPLATE _Binder template struct _Forced_result_type { // used by bind() - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret _RESULT_TYPE_NAME; }; template diff --git a/stl/inc/map b/stl/inc/map index 26a664d65ff..94b421a0f4f 100644 --- a/stl/inc/map +++ b/stl/inc/map @@ -47,9 +47,9 @@ public: class value_compare { public: - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef value_type first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef value_type second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef value_type _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef value_type _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; _NODISCARD bool operator()(const value_type& _Left, const value_type& _Right) const { // test if _Left precedes _Right by comparing just keys diff --git a/stl/inc/memory b/stl/inc/memory index a0487f60ebe..47f4093e758 100644 --- a/stl/inc/memory +++ b/stl/inc/memory @@ -2213,9 +2213,9 @@ struct owner_less; // not defined template struct owner_less> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef shared_ptr<_Ty> first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef shared_ptr<_Ty> second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef shared_ptr<_Ty> _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef shared_ptr<_Ty> _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; _NODISCARD bool operator()(const shared_ptr<_Ty>& _Left, const shared_ptr<_Ty>& _Right) const noexcept { return _Left.owner_before(_Right); @@ -2232,9 +2232,9 @@ struct owner_less> { template struct owner_less> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef weak_ptr<_Ty> first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef weak_ptr<_Ty> second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef weak_ptr<_Ty> _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef weak_ptr<_Ty> _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; _NODISCARD bool operator()(const weak_ptr<_Ty>& _Left, const weak_ptr<_Ty>& _Right) const noexcept { return _Left.owner_before(_Right); @@ -2286,8 +2286,8 @@ struct hash> : _Conditionally_enabled_hash struct hash> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef shared_ptr<_Ty> argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef shared_ptr<_Ty> _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const shared_ptr<_Ty>& _Keyval) const noexcept { return hash::element_type*>()(_Keyval.get()); diff --git a/stl/inc/system_error b/stl/inc/system_error index 39194383a1c..6b4e54f89b7 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -356,8 +356,8 @@ _NODISCARD inline error_condition make_error_condition(io_errc _Errno) noexcept // STRUCT TEMPLATE SPECIALIZATION hash template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef error_code argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef error_code _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const error_code& _Keyval) const noexcept { return hash{}(_Keyval.value()); @@ -366,8 +366,8 @@ struct hash { template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef error_condition argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef error_condition _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const error_condition& _Keyval) const noexcept { return hash{}(_Keyval.value()); diff --git a/stl/inc/thread b/stl/inc/thread index f34e6617911..f580a9e6c50 100644 --- a/stl/inc/thread +++ b/stl/inc/thread @@ -234,8 +234,8 @@ basic_ostream<_Ch, _Tr>& operator<<(basic_ostream<_Ch, _Tr>& _Str, thread::id _I // STRUCT TEMPLATE SPECIALIZATION hash template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef thread::id argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef thread::id _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const thread::id _Keyval) const noexcept { return _Hash_representation(_Keyval._Id); diff --git a/stl/inc/type_traits b/stl/inc/type_traits index e06b19f825b..010e44a38d5 100644 --- a/stl/inc/type_traits +++ b/stl/inc/type_traits @@ -78,13 +78,13 @@ struct _Arg_types {}; // provide argument_type, etc. (sometimes) template struct _Arg_types<_Ty1> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty1 argument_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty1 _ARGUMENT_TYPE_NAME; }; template struct _Arg_types<_Ty1, _Ty2> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty1 first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty2 second_argument_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty1 _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty2 _SECOND_ARGUMENT_TYPE_NAME; }; // STRUCT TEMPLATE is_function @@ -97,7 +97,7 @@ struct _Is_function { // determine whether _Ty is a function template \ struct _Is_function<_Ret CALL_OPT(_Types...) CV_OPT REF_OPT NOEXCEPT_OPT> : _Arg_types<_Types...> { \ using _Bool_type = true_type; \ - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret result_type; \ + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret _RESULT_TYPE_NAME; \ }; _NON_MEMBER_CALL_CV_REF_NOEXCEPT(_IS_FUNCTION) @@ -107,7 +107,7 @@ _NON_MEMBER_CALL_CV_REF_NOEXCEPT(_IS_FUNCTION) template \ struct _Is_function<_Ret(_Types..., ...) CV_REF_NOEXCEPT_OPT> { /* no calling conventions for ellipsis */ \ using _Bool_type = true_type; \ - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret result_type; \ + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret _RESULT_TYPE_NAME; \ }; _CLASS_DEFINE_CV_REF_NOEXCEPT(_IS_FUNCTION_ELLIPSIS) @@ -130,7 +130,7 @@ struct _Is_memfunptr { // base class for member function pointer predicates struct _Is_memfunptr<_Ret (CALL_OPT _Arg0::*)(_Types...) CV_OPT REF_OPT NOEXCEPT_OPT> \ : _Arg_types { \ using _Bool_type = true_type; \ - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret result_type; \ + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret _RESULT_TYPE_NAME; \ using _Class_type = _Arg0; \ using _Guide_type = enable_if, _Ret(_Types...)>; \ }; @@ -143,7 +143,7 @@ _MEMBER_CALL_CV_REF_NOEXCEPT(_IS_MEMFUNPTR) struct _Is_memfunptr<_Ret (_Arg0::*)(_Types..., ...) \ CV_REF_NOEXCEPT_OPT> { /* no calling conventions for ellipsis */ \ using _Bool_type = true_type; \ - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret result_type; \ + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ret _RESULT_TYPE_NAME; \ using _Class_type = _Arg0; \ using _Guide_type = enable_if; \ }; @@ -1798,7 +1798,7 @@ struct _Weak_result_type {}; // default definition _STL_DISABLE_DEPRECATED_WARNING template struct _Weak_result_type<_Ty, void_t> { // defined if _Ty::result_type exists - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::result_type result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::result_type _RESULT_TYPE_NAME; }; _STL_RESTORE_DEPRECATED_WARNING @@ -1809,7 +1809,7 @@ _STL_DISABLE_DEPRECATED_WARNING template struct _Weak_argument_type<_Ty, void_t> : _Weak_result_type<_Ty> { // defined if _Ty::argument_type exists - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::argument_type argument_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::argument_type _ARGUMENT_TYPE_NAME; }; _STL_RESTORE_DEPRECATED_WARNING @@ -1821,8 +1821,8 @@ template struct _Weak_binary_args<_Ty, void_t> : _Weak_argument_type<_Ty> { // defined if both types exist - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::first_argument_type first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::second_argument_type second_argument_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::first_argument_type _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef typename _Ty::second_argument_type _SECOND_ARGUMENT_TYPE_NAME; }; _STL_RESTORE_DEPRECATED_WARNING @@ -2161,8 +2161,8 @@ struct hash; template struct _Conditionally_enabled_hash { // conditionally enabled hash base - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Kty argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Kty _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const _Kty& _Keyval) const noexcept(noexcept(hash<_Kty>::_Do_hash(_Keyval))) /* strengthened */ { @@ -2192,8 +2192,8 @@ struct hash template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef float argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef float _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const float _Keyval) const noexcept { return _Hash_representation(_Keyval == 0.0F ? 0.0F : _Keyval); // map -0 to 0 } @@ -2201,8 +2201,8 @@ struct hash { template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef double argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef double _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const double _Keyval) const noexcept { return _Hash_representation(_Keyval == 0.0 ? 0.0 : _Keyval); // map -0 to 0 } @@ -2210,8 +2210,8 @@ struct hash { template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef long double argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef long double _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const long double _Keyval) const noexcept { return _Hash_representation(_Keyval == 0.0L ? 0.0L : _Keyval); // map -0 to 0 } @@ -2219,8 +2219,8 @@ struct hash { template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef nullptr_t argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef nullptr_t _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(nullptr_t) const noexcept { void* _Null{}; return _Hash_representation(_Null); diff --git a/stl/inc/typeindex b/stl/inc/typeindex index e4a2f7369fd..33d57b0150a 100644 --- a/stl/inc/typeindex +++ b/stl/inc/typeindex @@ -61,8 +61,8 @@ private: // STRUCT TEMPLATE SPECIALIZATION hash template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef type_index argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef type_index _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const type_index& _Keyval) const noexcept { return _Keyval.hash_code(); diff --git a/stl/inc/unordered_map b/stl/inc/unordered_map index ea275cf4815..9949e85956a 100644 --- a/stl/inc/unordered_map +++ b/stl/inc/unordered_map @@ -50,6 +50,7 @@ public: explicit _Umap_traits(const _Tr& _Traits) noexcept(is_nothrow_copy_constructible_v<_Tr>) : _Tr(_Traits) {} +#if _HAS_DEPRECATED_ADAPTOR_TYPEDEFS class value_compare { public: using first_argument_type = value_type; @@ -68,6 +69,9 @@ public: key_compare _Keycompobj; }; +#else // ^^^ _HAS_DEPRECATED_ADAPTOR_TYPEDEFS / !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS vvv + using value_compare = void; +#endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS template static const _Kty& _Kfn(const pair<_Ty1, _Ty2>& _Val) noexcept { // extract key from element value diff --git a/stl/inc/unordered_set b/stl/inc/unordered_set index bfd95f8c1d7..08fcd830ccb 100644 --- a/stl/inc/unordered_set +++ b/stl/inc/unordered_set @@ -49,7 +49,11 @@ public: explicit _Uset_traits(const _Tr& _Traits) noexcept(is_nothrow_copy_constructible_v<_Tr>) : _Tr(_Traits) {} +#if _HAS_DEPRECATED_ADAPTOR_TYPEDEFS using value_compare = key_compare; +#else // ^^^ _HAS_DEPRECATED_ADAPTOR_TYPEDEFS / !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS vvv + using value_compare = void; +#endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS static const _Kty& _Kfn(const value_type& _Val) noexcept { return _Val; diff --git a/stl/inc/variant b/stl/inc/variant index 0f748520899..23801a1c6e5 100644 --- a/stl/inc/variant +++ b/stl/inc/variant @@ -1730,8 +1730,8 @@ struct hash> : _Conditionally_enabled_hash template <> struct hash { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef monostate argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef monostate _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(monostate) const noexcept { return 1729; // Arbitrary value diff --git a/stl/inc/vector b/stl/inc/vector index cfee72f9b99..f6e7de4f588 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -2855,8 +2855,8 @@ _NODISCARD bool operator!=(const vector& _Left, const vector struct hash> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef vector argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef vector _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const vector& _Keyval) const noexcept { return _Hash_array_representation(_Keyval._Myvec.data(), _Keyval._Myvec.size()); diff --git a/stl/inc/xstddef b/stl/inc/xstddef index 340a1a3294d..fe5ac6d5ae4 100644 --- a/stl/inc/xstddef +++ b/stl/inc/xstddef @@ -47,9 +47,9 @@ struct binary_function { // base class for binary functions // STRUCT TEMPLATE plus template struct plus { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left + _Right; @@ -59,9 +59,9 @@ struct plus { // STRUCT TEMPLATE minus template struct minus { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left - _Right; @@ -71,9 +71,9 @@ struct minus { // STRUCT TEMPLATE multiplies template struct multiplies { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _RESULT_TYPE_NAME; constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left * _Right; @@ -83,9 +83,9 @@ struct multiplies { // STRUCT TEMPLATE equal_to template struct equal_to { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left == _Right; @@ -95,9 +95,9 @@ struct equal_to { // STRUCT TEMPLATE not_equal_to template struct not_equal_to { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left != _Right; @@ -107,9 +107,9 @@ struct not_equal_to { // STRUCT TEMPLATE greater template struct greater { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left > _Right; @@ -119,9 +119,9 @@ struct greater { // STRUCT TEMPLATE less template struct less { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left < _Right; @@ -131,9 +131,9 @@ struct less { // STRUCT TEMPLATE greater_equal template struct greater_equal { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left >= _Right; @@ -143,9 +143,9 @@ struct greater_equal { // STRUCT TEMPLATE less_equal template struct less_equal { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _FIRST_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty _SECOND_ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool _RESULT_TYPE_NAME; constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { return _Left <= _Right; diff --git a/stl/inc/xstring b/stl/inc/xstring index ff08c317ac7..a7bddb89098 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -1713,8 +1713,8 @@ using wstring_view = basic_string_view; // STRUCT TEMPLATE SPECIALIZATION hash FOR basic_string_view template struct hash> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef basic_string_view<_Elem, _Traits> argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef basic_string_view<_Elem, _Traits> _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const basic_string_view<_Elem, _Traits> _Keyval) const noexcept { return _Hash_array_representation(_Keyval.data(), _Keyval.size()); @@ -4474,8 +4474,8 @@ using u32string = basic_string, allocator struct hash> { - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef basic_string<_Elem, _Traits, _Alloc> argument_type; - _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t result_type; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef basic_string<_Elem, _Traits, _Alloc> _ARGUMENT_TYPE_NAME; + _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef size_t _RESULT_TYPE_NAME; _NODISCARD size_t operator()(const basic_string<_Elem, _Traits, _Alloc>& _Keyval) const noexcept { return _Hash_array_representation(_Keyval.c_str(), _Keyval.size()); diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index a5f9ff32dd1..50777ebf306 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -926,6 +926,22 @@ #define _HAS_DEPRECATED_NEGATORS (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_NEGATORS +#ifndef _HAS_DEPRECATED_ADAPTOR_TYPEDEFS +#define _HAS_DEPRECATED_ADAPTOR_TYPEDEFS (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_ADAPTOR_TYPEDEFS + +#if _HAS_DEPRECATED_ADAPTOR_TYPEDEFS +#define _ARGUMENT_TYPE_NAME argument_type +#define _FIRST_ARGUMENT_TYPE_NAME first_argument_type +#define _SECOND_ARGUMENT_TYPE_NAME second_argument_type +#define _RESULT_TYPE_NAME result_type +#else // ^^^ _HAS_DEPRECATED_ADAPTOR_TYPEDEFS / !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS vvv +#define _ARGUMENT_TYPE_NAME _Unnameable_argument +#define _FIRST_ARGUMENT_TYPE_NAME _Unnameable_first_argument +#define _SECOND_ARGUMENT_TYPE_NAME _Unnameable_second_argument +#define _RESULT_TYPE_NAME _Unnameable_result +#endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS + // LIBRARY FEATURE-TEST MACROS // C++14 From 7305ecd7830e9bac6d27f33040820c869a473b3b Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Fri, 13 Dec 2019 10:16:54 +0100 Subject: [PATCH 06/11] [exception] Remove deprecated uncaught_exception() --- stl/inc/exception | 2 ++ stl/inc/ostream | 6 +++++- stl/inc/yvals_core.h | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/stl/inc/exception b/stl/inc/exception index c2702e4eacf..95a16c6e8da 100644 --- a/stl/inc/exception +++ b/stl/inc/exception @@ -20,7 +20,9 @@ _STL_DISABLE_CLANG_WARNINGS _STD_BEGIN +#if _HAS_DEPRECATED_UNCAUGHT_EXCEPTION _CXX17_DEPRECATE_UNCAUGHT_EXCEPTION _CRTIMP2_PURE bool __CLRCALL_PURE_OR_CDECL uncaught_exception() noexcept; +#endif // _HAS_DEPRECATED_UNCAUGHT_EXCEPTION _CRTIMP2_PURE int __CLRCALL_PURE_OR_CDECL uncaught_exceptions() noexcept; _STD_END diff --git a/stl/inc/ostream b/stl/inc/ostream index d335116daca..2ea10372a3a 100644 --- a/stl/inc/ostream +++ b/stl/inc/ostream @@ -109,7 +109,11 @@ public: _STL_DISABLE_DEPRECATED_WARNING __CLR_OR_THIS_CALL ~sentry() noexcept { #if _HAS_EXCEPTIONS - if (!_STD uncaught_exception()) { // TRANSITION, ArchivedOS-12000909 +#if _HAS_DEPRECATED_UNCAUGHT_EXCEPTION + if (_STD uncaught_exception() == 0) { // TRANSITION, ArchivedOS-12000909 +#else // ^^^ _HAS_DEPRECATED_UNCAUGHT_EXCEPTION / !_HAS_DEPRECATED_UNCAUGHT_EXCEPTION vvv + if (_STD uncaught_exceptions() == 0) { +#endif // !_HAS_DEPRECATED_UNCAUGHT_EXCEPTION this->_Myostr._Osfx(); } #else // _HAS_EXCEPTIONS diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 50777ebf306..a5cd116505b 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -942,6 +942,10 @@ #define _RESULT_TYPE_NAME _Unnameable_result #endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS +#ifndef _HAS_DEPRECATED_UNCAUGHT_EXCEPTION +#define _HAS_DEPRECATED_UNCAUGHT_EXCEPTION (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_UNCAUGHT_EXCEPTION + // LIBRARY FEATURE-TEST MACROS // C++14 From 6efd1dda9892ad5a4e2bee9346c36c58a7816f5c Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 20 Nov 2019 14:13:22 +0100 Subject: [PATCH 07/11] [xmemory] Remove deprecated temporary buffers --- stl/inc/xmemory | 2 ++ stl/inc/yvals_core.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/stl/inc/xmemory b/stl/inc/xmemory index 8fe7667678d..8bd18efc456 100644 --- a/stl/inc/xmemory +++ b/stl/inc/xmemory @@ -1908,6 +1908,7 @@ _NoThrowFwdIt _Uninitialized_value_construct_n_unchecked1(_NoThrowFwdIt _UFirst, } #endif // _HAS_IF_CONSTEXPR +#if _HAS_DEPRECATED_TEMPORARY_BUFFER // FUNCTION TEMPLATE get_temporary_buffer template _CXX17_DEPRECATE_TEMPORARY_BUFFER _NODISCARD pair<_Ty*, ptrdiff_t> get_temporary_buffer(ptrdiff_t _Count) noexcept { @@ -1919,6 +1920,7 @@ template _CXX17_DEPRECATE_TEMPORARY_BUFFER void return_temporary_buffer(_Ty* _Pbuf) { _Return_temporary_buffer(_Pbuf); } +#endif // _HAS_DEPRECATED_TEMPORARY_BUFFER // STRUCT TEMPLATE _In_place_key_extract_set // assumes _Args have already been _Remove_cvref_t'd diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index a5cd116505b..0d65a814e61 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -946,6 +946,10 @@ #define _HAS_DEPRECATED_UNCAUGHT_EXCEPTION (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_UNCAUGHT_EXCEPTION +#ifndef _HAS_DEPRECATED_TEMPORARY_BUFFER +#define _HAS_DEPRECATED_TEMPORARY_BUFFER (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_TEMPORARY_BUFFER + // LIBRARY FEATURE-TEST MACROS // C++14 From 9351012a2fc890569dbfc5a7cf7fcbf22b7763dc Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 20 Nov 2019 14:10:57 +0100 Subject: [PATCH 08/11] [memory] Remove deprecated raw_storage_iterator --- stl/inc/memory | 3 ++- stl/inc/yvals_core.h | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/stl/inc/memory b/stl/inc/memory index 47f4093e758..c04c7f98408 100644 --- a/stl/inc/memory +++ b/stl/inc/memory @@ -417,7 +417,7 @@ _NoThrowFwdIt uninitialized_value_construct_n(_NoThrowFwdIt _First, const _Diff #endif // _HAS_CXX17 - +#if _HAS_DEPRECATED_RAW_STORAGE_ITERATOR // CLASS TEMPLATE raw_storage_iterator template class _CXX17_DEPRECATE_RAW_STORAGE_ITERATOR raw_storage_iterator { // wrap stores to raw buffer as output iterator @@ -462,6 +462,7 @@ public: private: _OutIt _Next; }; +#endif // _HAS_DEPRECATED_RAW_STORAGE_ITERATOR #if _HAS_AUTO_PTR_ETC diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 0d65a814e61..f3e5a844760 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -950,6 +950,10 @@ #define _HAS_DEPRECATED_TEMPORARY_BUFFER (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_TEMPORARY_BUFFER +#ifndef _HAS_DEPRECATED_RAW_STORAGE_ITERATOR +#define _HAS_DEPRECATED_RAW_STORAGE_ITERATOR (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_RAW_STORAGE_ITERATOR + // LIBRARY FEATURE-TEST MACROS // C++14 From d5e485a80975a0dbb9ef02354b4986c1277d9887 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 28 Jan 2020 16:40:48 -0800 Subject: [PATCH 09/11] Minor cleanups. memory Restore empty line. ostream Restore `!bool` instead of `bool == 0`. Introduce `const bool _Zero_uncaught_exceptions` for clarity. unordered_map unordered_set We can unconditionally eliminate all but the last bit of value_compare. yvals_core.h Sort the _HAS_DEPRECATED_MEOW macros. --- stl/inc/memory | 1 + stl/inc/ostream | 14 +++++++------- stl/inc/unordered_map | 23 +---------------------- stl/inc/unordered_set | 6 +----- stl/inc/yvals_core.h | 36 ++++++++++++++++++------------------ 5 files changed, 28 insertions(+), 52 deletions(-) diff --git a/stl/inc/memory b/stl/inc/memory index c04c7f98408..a605d2ae01f 100644 --- a/stl/inc/memory +++ b/stl/inc/memory @@ -417,6 +417,7 @@ _NoThrowFwdIt uninitialized_value_construct_n(_NoThrowFwdIt _First, const _Diff #endif // _HAS_CXX17 + #if _HAS_DEPRECATED_RAW_STORAGE_ITERATOR // CLASS TEMPLATE raw_storage_iterator template diff --git a/stl/inc/ostream b/stl/inc/ostream index 2ea10372a3a..137cad70f5a 100644 --- a/stl/inc/ostream +++ b/stl/inc/ostream @@ -108,17 +108,17 @@ public: _STL_DISABLE_DEPRECATED_WARNING __CLR_OR_THIS_CALL ~sentry() noexcept { -#if _HAS_EXCEPTIONS -#if _HAS_DEPRECATED_UNCAUGHT_EXCEPTION - if (_STD uncaught_exception() == 0) { // TRANSITION, ArchivedOS-12000909 +#if !_HAS_EXCEPTIONS + const bool _Zero_uncaught_exceptions = true; +#elif _HAS_DEPRECATED_UNCAUGHT_EXCEPTION + const bool _Zero_uncaught_exceptions = !_STD uncaught_exception(); // TRANSITION, ArchivedOS-12000909 #else // ^^^ _HAS_DEPRECATED_UNCAUGHT_EXCEPTION / !_HAS_DEPRECATED_UNCAUGHT_EXCEPTION vvv - if (_STD uncaught_exceptions() == 0) { + const bool _Zero_uncaught_exceptions = _STD uncaught_exceptions() == 0; #endif // !_HAS_DEPRECATED_UNCAUGHT_EXCEPTION + + if (_Zero_uncaught_exceptions) { this->_Myostr._Osfx(); } -#else // _HAS_EXCEPTIONS - this->_Myostr._Osfx(); -#endif // _HAS_EXCEPTIONS } _STL_RESTORE_DEPRECATED_WARNING diff --git a/stl/inc/unordered_map b/stl/inc/unordered_map index 9949e85956a..9c182556362 100644 --- a/stl/inc/unordered_map +++ b/stl/inc/unordered_map @@ -50,28 +50,7 @@ public: explicit _Umap_traits(const _Tr& _Traits) noexcept(is_nothrow_copy_constructible_v<_Tr>) : _Tr(_Traits) {} -#if _HAS_DEPRECATED_ADAPTOR_TYPEDEFS - class value_compare { - public: - using first_argument_type = value_type; - using second_argument_type = value_type; - using result_type = bool; - - _NODISCARD bool operator()(const value_type& _Left, const value_type& _Right) const - noexcept(noexcept(_Keycompobj(_Left.first, _Right.first))) /* strengthened */ { - // test if _Left precedes _Right by comparing just keys - return _Keycompobj(_Left.first, _Right.first); - } - - value_compare(const key_compare& _Keycomparg) noexcept( - is_nothrow_copy_constructible_v) /* strengthened */ - : _Keycompobj(_Keycomparg) {} - - key_compare _Keycompobj; - }; -#else // ^^^ _HAS_DEPRECATED_ADAPTOR_TYPEDEFS / !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS vvv - using value_compare = void; -#endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS + using value_compare = void; // TRANSITION, remove when _Standard becomes unconditionally true template static const _Kty& _Kfn(const pair<_Ty1, _Ty2>& _Val) noexcept { // extract key from element value diff --git a/stl/inc/unordered_set b/stl/inc/unordered_set index 08fcd830ccb..88837069af1 100644 --- a/stl/inc/unordered_set +++ b/stl/inc/unordered_set @@ -49,11 +49,7 @@ public: explicit _Uset_traits(const _Tr& _Traits) noexcept(is_nothrow_copy_constructible_v<_Tr>) : _Tr(_Traits) {} -#if _HAS_DEPRECATED_ADAPTOR_TYPEDEFS - using value_compare = key_compare; -#else // ^^^ _HAS_DEPRECATED_ADAPTOR_TYPEDEFS / !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS vvv - using value_compare = void; -#endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS + using value_compare = void; // TRANSITION, remove when _Standard becomes unconditionally true static const _Kty& _Kfn(const value_type& _Val) noexcept { return _Val; diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index f3e5a844760..f452ca6b88d 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -910,10 +910,22 @@ #define _HAS_FEATURES_REMOVED_IN_CXX20 (!_HAS_CXX20) #endif // _HAS_FEATURES_REMOVED_IN_CXX20 +#ifndef _HAS_DEPRECATED_ADAPTOR_TYPEDEFS +#define _HAS_DEPRECATED_ADAPTOR_TYPEDEFS (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_ADAPTOR_TYPEDEFS + #ifndef _HAS_DEPRECATED_IS_LITERAL_TYPE #define _HAS_DEPRECATED_IS_LITERAL_TYPE (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_IS_LITERAL_TYPE +#ifndef _HAS_DEPRECATED_NEGATORS +#define _HAS_DEPRECATED_NEGATORS (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_NEGATORS + +#ifndef _HAS_DEPRECATED_RAW_STORAGE_ITERATOR +#define _HAS_DEPRECATED_RAW_STORAGE_ITERATOR (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_RAW_STORAGE_ITERATOR + #ifndef _HAS_DEPRECATED_RESULT_OF #define _HAS_DEPRECATED_RESULT_OF (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_RESULT_OF @@ -922,13 +934,13 @@ #define _HAS_DEPRECATED_SHARED_PTR_UNIQUE (_HAS_FEATURES_REMOVED_IN_CXX20) #endif // _HAS_DEPRECATED_SHARED_PTR_UNIQUE -#ifndef _HAS_DEPRECATED_NEGATORS -#define _HAS_DEPRECATED_NEGATORS (_HAS_FEATURES_REMOVED_IN_CXX20) -#endif // _HAS_DEPRECATED_NEGATORS +#ifndef _HAS_DEPRECATED_TEMPORARY_BUFFER +#define _HAS_DEPRECATED_TEMPORARY_BUFFER (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_TEMPORARY_BUFFER -#ifndef _HAS_DEPRECATED_ADAPTOR_TYPEDEFS -#define _HAS_DEPRECATED_ADAPTOR_TYPEDEFS (_HAS_FEATURES_REMOVED_IN_CXX20) -#endif // _HAS_DEPRECATED_ADAPTOR_TYPEDEFS +#ifndef _HAS_DEPRECATED_UNCAUGHT_EXCEPTION +#define _HAS_DEPRECATED_UNCAUGHT_EXCEPTION (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_DEPRECATED_UNCAUGHT_EXCEPTION #if _HAS_DEPRECATED_ADAPTOR_TYPEDEFS #define _ARGUMENT_TYPE_NAME argument_type @@ -942,18 +954,6 @@ #define _RESULT_TYPE_NAME _Unnameable_result #endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS -#ifndef _HAS_DEPRECATED_UNCAUGHT_EXCEPTION -#define _HAS_DEPRECATED_UNCAUGHT_EXCEPTION (_HAS_FEATURES_REMOVED_IN_CXX20) -#endif // _HAS_DEPRECATED_UNCAUGHT_EXCEPTION - -#ifndef _HAS_DEPRECATED_TEMPORARY_BUFFER -#define _HAS_DEPRECATED_TEMPORARY_BUFFER (_HAS_FEATURES_REMOVED_IN_CXX20) -#endif // _HAS_DEPRECATED_TEMPORARY_BUFFER - -#ifndef _HAS_DEPRECATED_RAW_STORAGE_ITERATOR -#define _HAS_DEPRECATED_RAW_STORAGE_ITERATOR (_HAS_FEATURES_REMOVED_IN_CXX20) -#endif // _HAS_DEPRECATED_RAW_STORAGE_ITERATOR - // LIBRARY FEATURE-TEST MACROS // C++14 From 35635e7b07eb2fd7289467a94733a796043e5749 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 31 Jan 2020 18:15:43 -0800 Subject: [PATCH 10/11] Update llvm-project and skipped_tests.txt. This updates llvm-project as the escape hatch macro has been checked in upstream. This updates skipped_tests.txt because non-Standard code has appeared in the to_array test. --- llvm-project | 2 +- tests/libcxx/skipped_tests.txt | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/llvm-project b/llvm-project index 45f630d729e..5b14abf0c1d 160000 --- a/llvm-project +++ b/llvm-project @@ -1 +1 @@ -Subproject commit 45f630d729e2cce044ed48e6eaf4b8e61e06fede +Subproject commit 5b14abf0c1d0b64cbdba0c42957d55956374e5b8 diff --git a/tests/libcxx/skipped_tests.txt b/tests/libcxx/skipped_tests.txt index 06d1868ba22..50e4631de10 100644 --- a/tests/libcxx/skipped_tests.txt +++ b/tests/libcxx/skipped_tests.txt @@ -745,6 +745,11 @@ language.support\cmp\cmp.strongord\strongord.pass.cpp language.support\cmp\cmp.weakeq\cmp.weakeq.pass.cpp language.support\cmp\cmp.weakord\weakord.pass.cpp +# Comment: "Test C99 compound literal." +# Code: `(int[]){3, 4}` +# error C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax +containers\sequences\array\array.creation\to_array.pass.cpp + # *** LIKELY STL BUGS *** # Not yet analyzed, likely STL bugs. Assertions and other runtime failures. From 20005634f69b7226b0a587cad0df67f786bfcfea Mon Sep 17 00:00:00 2001 From: Casey Carter Date: Sun, 2 Feb 2020 08:35:50 -0800 Subject: [PATCH 11/11] Change default for _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 ...to `_HAS_FEATURES_REMOVED_IN_CXX20`. Fixes #478. --- stl/inc/yvals_core.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 778ef8857d7..30bfce0f010 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -590,12 +590,6 @@ #endif // _M_FP_EXCEPT #endif // _STD_VECTORIZE_WITH_FLOAT_CONTROL -// P1423R3 char8_t Backward Compatibility Remediation -// Controls whether we allow the stream insertions this proposal forbids -#ifndef _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 -#define _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 (!_HAS_CXX20) -#endif // _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 - // P0174R2 Deprecating Vestigial Library Parts // P0521R0 Deprecating shared_ptr::unique() // Other C++17 deprecation warnings @@ -962,6 +956,12 @@ #define _RESULT_TYPE_NAME _Unnameable_result #endif // !_HAS_DEPRECATED_ADAPTOR_TYPEDEFS +// P1423R3 char8_t Backward Compatibility Remediation +// Controls whether we allow the stream insertions this proposal forbids +#ifndef _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 +#define _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 (_HAS_FEATURES_REMOVED_IN_CXX20) +#endif // _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 + // LIBRARY FEATURE-TEST MACROS // C++14