]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Always define typedefs and hash functions for wide strings [PR 98725]
authorJonathan Wakely <jwakely@redhat.com>
Fri, 8 Oct 2021 13:24:18 +0000 (14:24 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 8 Oct 2021 23:57:49 +0000 (00:57 +0100)
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.

libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/include/bits/char_traits.h
libstdc++-v3/include/bits/stringfwd.h
libstdc++-v3/include/debug/string
libstdc++-v3/include/experimental/string_view
libstdc++-v3/include/std/string
libstdc++-v3/include/std/string_view

index 68c388408f07de255d7fee3705bb76d9fc61619e..59c84b1b6adc947896b94573d547360aa85cff4b 100644 (file)
@@ -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
index 3da6e28a513a192765f78bdf046c7e750d65818b..f6f8851c22dadc9465eae9e73843e7327c56f6d9 100644 (file)
@@ -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
index 7cb92ebcbfed05e1760678d2818251f8905a2330..bcfd350e50577de29f81391b4bd96a3a2663e796 100644 (file)
@@ -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
index 8744a55be64236e80c19ad3f28ab1c1199574d80..a8389528001c498d04f82b0b238cb84ebaccc24a 100644 (file)
@@ -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
index d9bc5cd166db1277a5b6c70f5343f0b5c1a0e74e..b8e4db8ef30731122b9e3bc45e2bcd65c77ddd2d 100644 (file)
@@ -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>
index 95412b6f7a3fb1010b77784a32902895366644ae..af840e887d5f50ad2114090de8062ef033ba404e 100644 (file)
@@ -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
index 996b03f93466d67b27781864df6d56928d7ca08f..fd92df6e425ae4543b5778a07382d0eb79148c73 100644 (file)
@@ -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>