diff options
author | Tom Honermann <tom@honermann.net> | 2019-11-29 17:43:42 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-11-29 17:43:42 +0000 |
commit | 2b4e2c93d908afb575b7f9bcd0c8c9ad63e717d0 (patch) | |
tree | 696633db265f9ecfc6fb989121ad0b8f725ffd9f /libstdc++-v3/include/std/ostream | |
parent | a1e7d33bb9458f76a2d49209a3825940ca7fbe0b (diff) | |
download | gcc-2b4e2c93d908afb575b7f9bcd0c8c9ad63e717d0.zip gcc-2b4e2c93d908afb575b7f9bcd0c8c9ad63e717d0.tar.gz gcc-2b4e2c93d908afb575b7f9bcd0c8c9ad63e717d0.tar.bz2 |
libstdc++: P1423R3 char8_t remediation (2/4)
Update feature test macro, add deleted operators, update u8path
This patch increments the __cpp_lib_char8_t feature test macro, adds deleted
operator<< overloads for basic_ostream, and modifies u8path to accept
sequences of char8_t for both the C++17 implementation of std::filesystem, and
the filesystem TS implementation.
The implementation mechanism used for u8path differs between the C++17 and
filesystem TS implementations. The changes to the former take advantage of
C++17 'if constexpr'. The changes to the latter retain C++11 compatibility
and rely on tag dispatching.
2019-11-29 Tom Honermann <tom@honermann.net>
Update feature test macro, add deleted operators, update u8path
* include/bits/c++config: Bumped the value of the __cpp_lib_char8_t
feature test macro.
* include/bits/fs_path.h (u8path): Modified u8path to accept sequences
of char8_t.
* include/experimental/bits/fs_path.h (u8path): Modified u8path to
accept sequences of char8_t.
* include/std/ostream: Added deleted overloads of wchar_t, char8_t,
char16_t, and char32_t for ordinary and wide formatted character and
string inserters.
From-SVN: r278856
Diffstat (limited to 'libstdc++-v3/include/std/ostream')
-rw-r--r-- | libstdc++-v3/include/std/ostream | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/libstdc++-v3/include/std/ostream b/libstdc++-v3/include/std/ostream index 2541d97..771c28d 100644 --- a/libstdc++-v3/include/std/ostream +++ b/libstdc++-v3/include/std/ostream @@ -527,6 +527,47 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c) { return (__out << static_cast<char>(__c)); } + +#if __cplusplus > 201703L + // The following deleted overloads prevent formatting character values as + // numeric values. + +#ifdef _GLIBCXX_USE_WCHAR_T + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete; +#endif // _GLIBCXX_USE_WCHAR_T + +#ifdef _GLIBCXX_USE_CHAR8_T + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, char8_t) = delete; +#endif + + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, char16_t) = delete; + + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, char32_t) = delete; + +#ifdef _GLIBCXX_USE_WCHAR_T +#ifdef _GLIBCXX_USE_CHAR8_T + template<class _Traits> + basic_ostream<wchar_t, _Traits>& + operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete; +#endif // _GLIBCXX_USE_CHAR8_T + + template<class _Traits> + basic_ostream<wchar_t, _Traits>& + operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete; + + template<class _Traits> + basic_ostream<wchar_t, _Traits>& + operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete; +#endif // _GLIBCXX_USE_WCHAR_T +#endif // C++20 //@} //@{ @@ -582,6 +623,47 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline basic_ostream<char, _Traits> & operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s) { return (__out << reinterpret_cast<const char*>(__s)); } + +#if __cplusplus > 201703L + // The following deleted overloads prevent formatting strings as + // pointer values. + +#ifdef _GLIBCXX_USE_WCHAR_T + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete; +#endif // _GLIBCXX_USE_WCHAR_T + +#ifdef _GLIBCXX_USE_CHAR8_T + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete; +#endif // _GLIBCXX_USE_CHAR8_T + + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete; + + template<class _Traits> + basic_ostream<char, _Traits>& + operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete; + +#ifdef _GLIBCXX_USE_WCHAR_T +#ifdef _GLIBCXX_USE_CHAR8_T + template<class _Traits> + basic_ostream<wchar_t, _Traits>& + operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete; +#endif + + template<class _Traits> + basic_ostream<wchar_t, _Traits>& + operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete; + + template<class _Traits> + basic_ostream<wchar_t, _Traits>& + operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete; +#endif // _GLIBCXX_USE_WCHAR_T +#endif // C++20 //@} // Standard basic_ostream manipulators |