[libc++] Remove default definition of std::char_traits
authorLouis Dionne <ldionne.2@gmail.com>
Thu, 17 Nov 2022 15:47:18 +0000 (10:47 -0500)
committerLouis Dionne <ldionne.2@gmail.com>
Wed, 23 Nov 2022 14:51:01 +0000 (09:51 -0500)
commitaeecef08c385b1e4955155dd649a2d3724463849
treebef059bedcb4a4a4b3a304f0208936fff5618c4a
parent647ddc08f43c05131031cfe3c6114d7870f5a117
[libc++] Remove default definition of std::char_traits

This patch removes the base template implementation for std::char_traits.
If my reading of http://eel.is/c++draft/char.traits is correct, the
Standard mandates that the library provides specializations for several
types like char and wchar_t, but not any implementation in the base
template. Indeed, such an implementation is bound to be incorrect for
most types anyways, since things like `eof()` and `int_type` will definitely
have to be customized.

Since the base template implementation should not have worked for anyone,
this shouldn't be a breaking change (I expect that anyone defining a
custom character type today will already have to provide their own
specialization of char_traits). However, since we're aware of some users
of char_traits for unsigned char and signed char, we're keeping those two
specializations around for two releases to give people some time to migrate.

Differential Revision: https://reviews.llvm.org/D138307
libcxx/docs/ReleaseNotes.rst
libcxx/include/__string/char_traits.h
libcxx/test/libcxx/strings/char.traits/char.traits.specializations/signed_unsigned_char.deprecated.verify.cpp [new file with mode: 0644]
libcxx/test/libcxx/strings/char.traits/char.traits.specializations/signed_unsigned_char.pass.cpp [new file with mode: 0644]
libcxx/test/std/ranges/range.adaptors/range.lazy.split/general.pass.cpp
libcxx/test/std/strings/basic.string/string.modifiers/string_append/push_back.pass.cpp