[libc++][test] Test nasty_string in C++20 (#135338)

It seems that we can only rely on C++20 features and make `nasty_string`
also tested for MSVC STL.
This commit is contained in:
A. Jiang 2025-04-13 11:23:13 +08:00 committed by GitHub
parent 39662922e1
commit 3e7be494f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 9 additions and 26 deletions

View File

@ -43,7 +43,7 @@ TEST_CONSTEXPR_CXX20 bool test() {
test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
test<std::basic_string<char, std::char_traits<char>, safe_allocator<char>>>();
#ifndef TEST_HAS_NO_NASTY_STRING
#if TEST_STD_VER >= 20
test<nasty_string>();
#endif

View File

@ -74,7 +74,7 @@ TEST_CONSTEXPR_CXX20 bool test() {
test_assign<std::u16string>();
test_assign<std::u32string>();
#endif
#ifndef TEST_HAS_NO_NASTY_STRING
#if TEST_STD_VER >= 20
test_assign<nasty_string>();
#endif

View File

@ -23,21 +23,7 @@
// library uses the provided `CharTraits` instead of using operations on
// the value_type directly.
// When using the code during constant evaluation it relies on
// P2647R1 Permitting static constexpr variables in constexpr functions
// This is a C++23 feature, which is not supported by all compilers yet.
// * GCC >= 13
// * Clang >= 16
// * MSVC no support yet
//
// TODO After there is proper compiler support use TEST_STD_VER >= 23 instead
// of this macro in the tests.
#if TEST_STD_VER < 23 || __cpp_constexpr < 202211L
# define TEST_HAS_NO_NASTY_STRING
#endif
#ifndef TEST_HAS_NO_NASTY_STRING
#if TEST_STD_VER >= 20
// Make sure the char-like operations in strings do not depend on the char-like type.
struct nasty_char {
template <typename T>
@ -165,10 +151,8 @@ struct ToNastyChar {
template <std::size_t N>
ToNastyChar(const char (&)[N]) -> ToNastyChar<N>;
template <ToNastyChar t>
constexpr auto to_nasty_char() {
return t;
}
template <ToNastyChar Str>
inline constexpr auto static_nasty_text = Str;
// A macro like MAKE_CSTRING
//
@ -178,13 +162,12 @@ constexpr auto to_nasty_char() {
# define CONVERT_TO_CSTRING(CHAR, STR) \
[]<class CharT> { \
if constexpr (std::is_same_v<CharT, nasty_char>) { \
static constexpr auto result = to_nasty_char<STR>(); \
return result.text; \
return static_nasty_text<STR>.text; \
} else \
return MAKE_CSTRING(CharT, STR); \
}.template operator()<CHAR>() /* */
#else // TEST_HAS_NO_NASTY_STRING
#else // TEST_STD_VER >= 20
# define CONVERT_TO_CSTRING(CharT, STR) MAKE_CSTRING(CharT, STR)
#endif // TEST_HAS_NO_NASTY_STRING
#endif // TEST_STD_VER >= 20
#endif // TEST_SUPPORT_NASTY_STRING_H
#endif // TEST_SUPPORT_NASTY_STRING_H