From 0afb9ebaab09b999f1d158ffc3fb906fdab9df67 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 8 Oct 2021 14:24:18 +0100 Subject: libstdc++: Always define typedefs and hash functions for wide strings [PR 98725] The wstring and wstring_view typedefs should be enabled even if isn't supported, because char_traits works unconditionally. Similarly, the std::hash specializations for wide strings do not depend on support. Although the primary template works OK for std::char_traits in the absence of support, this patch still defines it as an explicit specialization for compatibility with declarations that expect it to be specialized. The explicit specialization just uses the same __gnu_cxx::char_traits base class as the primary template. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/bits/char_traits.h (char_traits): Define explicit specialization unconditionally. * include/bits/basic_string.h (hash): Define unconditionally. Do not check _GLIBCXX_USE_WCHAR_T. * include/bits/stringfwd.h (wstring): Likewise. * include/debug/string (wstring): Likewise. * include/experimental/string_view (experimental::wstring_view) (hash): Likewise. * include/std/string (pmr::wstring, hash): Likewise. * include/std/string_view (wstring_view, hash): Likewise. --- libstdc++-v3/include/bits/basic_string.h | 4 ---- libstdc++-v3/include/bits/char_traits.h | 6 +++++- libstdc++-v3/include/bits/stringfwd.h | 4 ---- libstdc++-v3/include/debug/string | 2 -- libstdc++-v3/include/experimental/string_view | 6 ------ libstdc++-v3/include/std/string | 4 ---- libstdc++-v3/include/std/string_view | 6 ------ 7 files changed, 5 insertions(+), 27 deletions(-) diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 68c3884..59c84b1 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -3954,7 +3954,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __is_fast_hash> : std::false_type { }; -#ifdef _GLIBCXX_USE_WCHAR_T /// std::hash specialization for wstring. template<> struct hash @@ -3969,7 +3968,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct __is_fast_hash> : std::false_type { }; -#endif #endif /* _GLIBCXX_COMPATIBILITY_CXX0X */ #ifdef _GLIBCXX_USE_CHAR8_T @@ -4034,12 +4032,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator""s(const char* __str, size_t __len) { return basic_string{__str, __len}; } -#ifdef _GLIBCXX_USE_WCHAR_T _GLIBCXX_DEFAULT_ABI_TAG inline basic_string operator""s(const wchar_t* __str, size_t __len) { return basic_string{__str, __len}; } -#endif #ifdef _GLIBCXX_USE_CHAR8_T _GLIBCXX_DEFAULT_ABI_TAG diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h index 3da6e28..f6f8851 100644 --- a/libstdc++-v3/include/bits/char_traits.h +++ b/libstdc++-v3/include/bits/char_traits.h @@ -256,7 +256,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * for advice on how to make use of this class for @a unusual character * types. Also, check out include/ext/pod_char_traits.h. */ - template + template struct char_traits : public __gnu_cxx::char_traits<_CharT> { }; @@ -507,6 +507,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION not_eof(const int_type& __c) _GLIBCXX_NOEXCEPT { return eq_int_type(__c, eof()) ? 0 : __c; } }; +#else // _GLIBCXX_USE_WCHAR_T + template<> + struct char_traits : public __gnu_cxx::char_traits + { }; #endif //_GLIBCXX_USE_WCHAR_T #ifdef _GLIBCXX_USE_CHAR8_T diff --git a/libstdc++-v3/include/bits/stringfwd.h b/libstdc++-v3/include/bits/stringfwd.h index 7cb92eb..bcfd350 100644 --- a/libstdc++-v3/include/bits/stringfwd.h +++ b/libstdc++-v3/include/bits/stringfwd.h @@ -54,9 +54,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct char_traits; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct char_traits; -#endif #ifdef _GLIBCXX_USE_CHAR8_T template<> struct char_traits; @@ -78,10 +76,8 @@ _GLIBCXX_END_NAMESPACE_CXX11 /// A string of @c char typedef basic_string string; -#ifdef _GLIBCXX_USE_WCHAR_T /// A string of @c wchar_t typedef basic_string wstring; -#endif #ifdef _GLIBCXX_USE_CHAR8_T /// A string of @c char8_t diff --git a/libstdc++-v3/include/debug/string b/libstdc++-v3/include/debug/string index 8744a55..a838952 100644 --- a/libstdc++-v3/include/debug/string +++ b/libstdc++-v3/include/debug/string @@ -1298,9 +1298,7 @@ namespace __gnu_debug typedef basic_string string; -#ifdef _GLIBCXX_USE_WCHAR_T typedef basic_string wstring; -#endif #ifdef _GLIBCXX_USE_CHAR8_T /// A string of @c char8_t diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view index d9bc5cd..b8e4db8 100644 --- a/libstdc++-v3/include/experimental/string_view +++ b/libstdc++-v3/include/experimental/string_view @@ -564,9 +564,7 @@ inline namespace fundamentals_v1 // basic_string_view typedef names using string_view = basic_string_view; -#ifdef _GLIBCXX_USE_WCHAR_T using wstring_view = basic_string_view; -#endif #ifdef _GLIBCXX_USE_CHAR8_T using u8string_view = basic_string_view; #endif @@ -593,7 +591,6 @@ inline namespace fundamentals_v1 struct __is_fast_hash> : std::false_type { }; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct hash : public __hash_base @@ -607,7 +604,6 @@ inline namespace fundamentals_v1 template<> struct __is_fast_hash> : std::false_type { }; -#endif #ifdef _GLIBCXX_USE_CHAR8_T template<> @@ -665,11 +661,9 @@ namespace experimental operator""sv(const char* __str, size_t __len) noexcept { return basic_string_view{__str, __len}; } -#ifdef _GLIBCXX_USE_WCHAR_T inline constexpr basic_string_view operator""sv(const wchar_t* __str, size_t __len) noexcept { return basic_string_view{__str, __len}; } -#endif #ifdef _GLIBCXX_USE_CHAR8_T inline constexpr basic_string_view diff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string index 95412b6..af840e8 100644 --- a/libstdc++-v3/include/std/string +++ b/libstdc++-v3/include/std/string @@ -68,9 +68,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif using u16string = basic_string; using u32string = basic_string; -#ifdef _GLIBCXX_USE_WCHAR_T using wstring = basic_string; -#endif } // namespace pmr template @@ -100,12 +98,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct hash : public __hash_string_base { }; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct hash : public __hash_string_base { }; -#endif _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index 996b03f..fd92df6 100644 --- a/libstdc++-v3/include/std/string_view +++ b/libstdc++-v3/include/std/string_view @@ -674,9 +674,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // basic_string_view typedef names using string_view = basic_string_view; -#ifdef _GLIBCXX_USE_WCHAR_T using wstring_view = basic_string_view; -#endif #ifdef _GLIBCXX_USE_CHAR8_T using u8string_view = basic_string_view; #endif @@ -701,7 +699,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __is_fast_hash> : std::false_type { }; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct hash : public __hash_base @@ -715,7 +712,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct __is_fast_hash> : std::false_type { }; -#endif #ifdef _GLIBCXX_USE_CHAR8_T template<> @@ -770,11 +766,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator""sv(const char* __str, size_t __len) noexcept { return basic_string_view{__str, __len}; } -#ifdef _GLIBCXX_USE_WCHAR_T inline constexpr basic_string_view operator""sv(const wchar_t* __str, size_t __len) noexcept { return basic_string_view{__str, __len}; } -#endif #ifdef _GLIBCXX_USE_CHAR8_T inline constexpr basic_string_view -- cgit v1.1