From 3e7be494f84e51d5f4245d6f39e380a500f226a6 Mon Sep 17 00:00:00 2001 From: "A. Jiang" <de34@live.cn> Date: Sun, 13 Apr 2025 11:23:13 +0800 Subject: [PATCH] [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. --- .../string_append/initializer_list.pass.cpp | 2 +- .../string_assign/string.pass.cpp | 2 +- libcxx/test/support/nasty_string.h | 31 +++++-------------- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp index f1f5828bfe21..d494cd0435b9 100644 --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp @@ -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 diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp index 8b310630bf07..edd3913fa01f 100644 --- a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp @@ -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 diff --git a/libcxx/test/support/nasty_string.h b/libcxx/test/support/nasty_string.h index fa4c1b676431..c2968f52e3a0 100644 --- a/libcxx/test/support/nasty_string.h +++ b/libcxx/test/support/nasty_string.h @@ -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