public inbox for libstdc++-cvs@sourceware.org help / color / mirror / Atom feed
From: Jonathan Wakely <redi@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-4263] libstdc++: Always define typedefs and hash functions for wide strings [PR 98725] Date: Sat, 9 Oct 2021 00:15:12 +0000 (GMT) [thread overview] Message-ID: <20211009001512.2E5873857C73@sourceware.org> (raw) https://gcc.gnu.org/g:0afb9ebaab09b999f1d158ffc3fb906fdab9df67 commit r12-4263-g0afb9ebaab09b999f1d158ffc3fb906fdab9df67 Author: Jonathan Wakely <jwakely@redhat.com> Date: Fri Oct 8 14:24:18 2021 +0100 libstdc++: Always define typedefs and hash functions for wide strings [PR 98725] The wstring and wstring_view typedefs should be enabled even if <wchar.h> isn't supported, because char_traits<wchar_t> works unconditionally. Similarly, the std::hash specializations for wide strings do not depend on <wchar.h> support. Although the primary template works OK for std::char_traits<wchar_t> in the absence of <wchar.h> 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<wchar_t>): Define explicit specialization unconditionally. * include/bits/basic_string.h (hash<wstring>): 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<experimental::wstring_view>): Likewise. * include/std/string (pmr::wstring, hash<pmr::wstring>): Likewise. * include/std/string_view (wstring_view, hash<wstring_view>): Likewise. Diff: --- 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 68c388408f0..59c84b1b6ad 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<hash<string>> : std::false_type { }; -#ifdef _GLIBCXX_USE_WCHAR_T /// std::hash specialization for wstring. template<> struct hash<wstring> @@ -3969,7 +3968,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct __is_fast_hash<hash<wstring>> : 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<char>{__str, __len}; } -#ifdef _GLIBCXX_USE_WCHAR_T _GLIBCXX_DEFAULT_ABI_TAG inline basic_string<wchar_t> operator""s(const wchar_t* __str, size_t __len) { return basic_string<wchar_t>{__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 3da6e28a513..f6f8851c22d 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<class _CharT> + template<typename _CharT> 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<wchar_t> : public __gnu_cxx::char_traits<wchar_t> + { }; #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 7cb92ebcbfe..bcfd350e505 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<char>; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct char_traits<wchar_t>; -#endif #ifdef _GLIBCXX_USE_CHAR8_T template<> struct char_traits<char8_t>; @@ -78,10 +76,8 @@ _GLIBCXX_END_NAMESPACE_CXX11 /// A string of @c char typedef basic_string<char> string; -#ifdef _GLIBCXX_USE_WCHAR_T /// A string of @c wchar_t typedef basic_string<wchar_t> 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 8744a55be64..a8389528001 100644 --- a/libstdc++-v3/include/debug/string +++ b/libstdc++-v3/include/debug/string @@ -1298,9 +1298,7 @@ namespace __gnu_debug typedef basic_string<char> string; -#ifdef _GLIBCXX_USE_WCHAR_T typedef basic_string<wchar_t> 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 d9bc5cd166d..b8e4db8ef30 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<char>; -#ifdef _GLIBCXX_USE_WCHAR_T using wstring_view = basic_string_view<wchar_t>; -#endif #ifdef _GLIBCXX_USE_CHAR8_T using u8string_view = basic_string_view<char8_t>; #endif @@ -593,7 +591,6 @@ inline namespace fundamentals_v1 struct __is_fast_hash<hash<experimental::string_view>> : std::false_type { }; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct hash<experimental::wstring_view> : public __hash_base<size_t, wstring> @@ -607,7 +604,6 @@ inline namespace fundamentals_v1 template<> struct __is_fast_hash<hash<experimental::wstring_view>> : 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<char>{__str, __len}; } -#ifdef _GLIBCXX_USE_WCHAR_T inline constexpr basic_string_view<wchar_t> operator""sv(const wchar_t* __str, size_t __len) noexcept { return basic_string_view<wchar_t>{__str, __len}; } -#endif #ifdef _GLIBCXX_USE_CHAR8_T inline constexpr basic_string_view<char8_t> diff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string index 95412b6f7a3..af840e887d5 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<char16_t>; using u32string = basic_string<char32_t>; -#ifdef _GLIBCXX_USE_WCHAR_T using wstring = basic_string<wchar_t>; -#endif } // namespace pmr template<typename _Str> @@ -100,12 +98,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct hash<pmr::u32string> : public __hash_string_base<pmr::u32string> { }; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct hash<pmr::wstring> : public __hash_string_base<pmr::wstring> { }; -#endif _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index 996b03f9346..fd92df6e425 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<char>; -#ifdef _GLIBCXX_USE_WCHAR_T using wstring_view = basic_string_view<wchar_t>; -#endif #ifdef _GLIBCXX_USE_CHAR8_T using u8string_view = basic_string_view<char8_t>; #endif @@ -701,7 +699,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __is_fast_hash<hash<string_view>> : std::false_type { }; -#ifdef _GLIBCXX_USE_WCHAR_T template<> struct hash<wstring_view> : public __hash_base<size_t, wstring_view> @@ -715,7 +712,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct __is_fast_hash<hash<wstring_view>> : 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<char>{__str, __len}; } -#ifdef _GLIBCXX_USE_WCHAR_T inline constexpr basic_string_view<wchar_t> operator""sv(const wchar_t* __str, size_t __len) noexcept { return basic_string_view<wchar_t>{__str, __len}; } -#endif #ifdef _GLIBCXX_USE_CHAR8_T inline constexpr basic_string_view<char8_t>
reply other threads:[~2021-10-09 0:15 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211009001512.2E5873857C73@sourceware.org \ --to=redi@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).